如何接单做网站,刷粉网站推广快点,医疗网站跳出率平均是多少,51一起做网站目录 一、外观模式介绍
1.1 外观模式定义
1.2 外观模式原理
1.2.1 外观模式类图
1.2.2 模式角色说明
1.2.3 示例代码
二、外观模式的应用
2.1 需求说明
2.2 需求实现
2.2.1 类图
2.2.2 具体实现
2.2.2.1 灯光类
2.2.2.2 电视类
2.2.2.3 空调类
2.2.2.4 外观面板类…
目录 一、外观模式介绍
1.1 外观模式定义
1.2 外观模式原理
1.2.1 外观模式类图
1.2.2 模式角色说明
1.2.3 示例代码
二、外观模式的应用
2.1 需求说明
2.2 需求实现
2.2.1 类图
2.2.2 具体实现
2.2.2.1 灯光类
2.2.2.2 电视类
2.2.2.3 空调类
2.2.2.4 外观面板类
2.2.2.5 测试类
三、外观模式总结
3.1 外观模式的优点
3.2 外观模式的缺点
3.3 外观模式的使用场景 一、外观模式介绍
1.1 外观模式定义
外观模式( Facade Pattern)也叫门面模式, 外观模式的原始定义是为子系统中的一组接口提供统一的接口。它定义了一个更高级别的接口使子系统更易于使用。 外观模式是一种通过为多个复杂的子系统提供一个一致的接口而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口外部应用程序不用关心内部子系统的具体的细节这样会大大降低应用程序的复杂度提高了程序的可维护性。 门面模式有点类似之前讲到的迪米特法则最少知识原则和接口隔离原则两个有交互的系统只暴露有限的必要的接口。 门面类充当了系统中的服务员它为多个业务类的调用提供了一个统一的入口简化了类与类之间的交互如果没有门面类每个客户类需要和多个子系统之间进行复杂的交互系统的耦合度将会很大。
1.2 外观模式原理
1.2.1 外观模式类图 1.2.2 模式角色说明
外观Facade模式包含以下主要角色
外观Facade角色
为多个子系统对外提供一个共同的接口。外观角色中可以知道多个相关的子系统中的功能和责任。在正常情况下它将所有从客户端发来的请求委派到相应的子系统传递给相应的子系统对象处理。
子系统Sub System角色
实现系统的部分功能客户可以通过外观角色访问它。每一个子系统可以是一个类也可以是多个类的集合。每一个子系统都可以被客户端直接调用或者被外观角色调用。子系统并不知道外观的存在对于子系统而言外观角色仅仅是另一个客户端而已。
1.2.3 示例代码
package main.java.cn.test.Facade.V1;/*** author ningzhaosheng* date 2024/1/14 13:17:07* description 业务类A*/
public class SubSystemA {public void methodA(){System.out.println(执行methodA() );}
}
package main.java.cn.test.Facade.V1;/*** author ningzhaosheng* date 2024/1/14 13:19:02* description 业务类B*/
public class SubSystemB {public void methodB(){System.out.println(执行methodB() );}
}
package main.java.cn.test.Facade.V1;/*** author ningzhaosheng* date 2024/1/14 13:19:29* description 业务类C*/
public class SubSystemC {public void methodC(){System.out.println(执行methodC() );}
}
package main.java.cn.test.Facade.V1;/*** author ningzhaosheng* date 2024/1/14 13:20:21* description 门面类*/
public class Facade {private SubSystemA obj1 new SubSystemA();private SubSystemB obj2 new SubSystemB();private SubSystemC obj3 new SubSystemC();public void method() {obj1.methodA();obj2.methodB();obj3.methodC();}
}
package main.java.cn.test.Facade.V1;/*** author ningzhaosheng* date 2024/1/14 13:20:53* description 测试类*/
public class Test {public static void main(String[] args) {Facade facade new Facade();facade.method();}
} 二、外观模式的应用
2.1 需求说明
智能家电控制。通过智能音箱来控制室内的灯、电视、空调.本来每个设备都需要进行独立的开关操作现在通过智能音箱完成对这几个设备的统一控制。
2.2 需求实现
2.2.1 类图 2.2.2 具体实现
2.2.2.1 灯光类
package main.java.cn.test.Facade.V2;/*** author ningzhaosheng* date 2024/1/14 13:27:24* description 灯光类*/
public class Light {public void on() {System.out.println(打开灯......);}public void off() {System.out.println(关闭灯......);}}
2.2.2.2 电视类
package main.java.cn.test.Facade.V2;/*** author ningzhaosheng* date 2024/1/14 13:27:54* description 电视类*/
public class TV {public void on() {System.out.println(打开电视......);}public void off() {System.out.println(关闭电视......);}
}
2.2.2.3 空调类
package main.java.cn.test.Facade.V2;/*** author ningzhaosheng* date 2024/1/14 13:28:27* description 空调类*/
public class AirCondition {public void on() {System.out.println(打开空调......);}public void off() {System.out.println(关闭空调......);}}
2.2.2.4 外观面板类
package main.java.cn.test.Facade.V2;/*** author ningzhaosheng* date 2024/1/14 13:29:36* description 外观面板类*/
public class SmartAppliancesFacade {private Light light;private TV tv;private AirCondition airCondition;public SmartAppliancesFacade() {this.light new Light();this.tv new TV();this.airCondition new AirCondition();}public void say(String message) {if (message.contains(打开)) {on();} else if (message.contains(关闭)) {off();} else {System.out.println(对不起没有听清楚您说什么! 请重新再说一遍);}}//起床后 语音开启 电灯 电视 空调private void on() {System.out.println(起床了!);light.on();tv.on();airCondition.on();}//睡觉前 语音关闭 电灯 电视 空调private void off() {System.out.println(睡觉了!);light.off();tv.off();airCondition.off();}}
2.2.2.5 测试类
package main.java.cn.test.Facade.V2;/*** author ningzhaosheng* date 2024/1/14 13:33:16* description 测试类*/
public class Test {public static void main(String[] args) {//创建外观对象SmartAppliancesFacade facade newSmartAppliancesFacade();facade.say(打开家电);facade.say(关闭家电);}
} 三、外观模式总结
3.1 外观模式的优点
它对客户端屏蔽了子系统组件减少了客户端所需要处理的对象数目并使子系统使用起来更加的容易。通过引入外观模式客户端代码将变得很简单与之关联的对象也很少。它实现了子系统与客户端之间的松耦合关系这使得子系统的变化不会影响到调用它的客户端只需要调整外观类即可。一个子系统的修改对其他子系统没有任何影响而子系统内部变化也不会影响到外观对象。
3.2 外观模式的缺点
不能很好的控制客户端直接使用子系统类如果客户端访问子系统类做太多的限制则减少了可变性和灵活性。如果设计不当增加新的子系统可能需要修改外观类的源代码违背了开闭原则。
3.3 外观模式的使用场景
简化复杂系统。
比如当我们开发了一整套的电商系统后包括订单、商品、支付、会员等系统我们不能让用户依次使用这些系统后才能完成商品的购买而是需要一个门户网站或手机 App 这样简化过的门面系统来提供在线的购物功能。
减少客户端处理的系统数量。
比如在 Web 应用中系统与系统之间的调用可能需要处理 Database 数据库、Model 业务对象等其中使用 Database 对象就需要处理打开数据库、关闭连接等操作然后转换为Model 业务对象实在是太麻烦了。如果能够创建一个数据库使用的门面其实就是常说的 DAO 层那么实现以上过程将变得容易很多。
让一个系统或对象为多个系统或对象工作。
比如线程池ThreadPool 就是一个门面模式它为系统提供了统一的线程对象的创建、销毁、使用等。
联合更多的系统来扩展原有系统。
当我们的电商系统中需要一些新功能时比如人脸识别我们可以不需要自行研发而是购买别家公司的系统 来提供服务这时通过门面系统就能方便快速地进行扩展。
作为一个简洁的中间层。
门面模式还可以用来隐藏或者封装系统中的分层结构同时作为一个简化的中间层来使用。比如在秒杀、库存、钱包等场景中我们需要共享有状态的数据时如商品库存、账户里的钱在不改变原有系统的前提下通过一个中间的共享层如将秒杀活动的商品库存总数统一放在 Redis 里就能统一进行各种服务如秒杀详情页、商品详情页、购物车等的调用。 好了本次分享就到这里欢迎大家继续阅读《设计模式》专栏其他设计模式内容如果有帮助到大家欢迎大家点赞关注收藏有疑问也欢迎大家评论留言