网站首页 > java教程 正文
定义
外观模式(Facade Pattern),也叫门面模式,原始定义是:为了子系统中的一组接口提供统一的接口。定义一个更高级别的接口,使子系统更易于使用。
大大降低应用程序的复杂度,提高了程序的可维护性。
编辑
结构图
代码演示
智能家电控制
通过智能音箱来控制室内的灯、电视、空调,本来每个设备都需要进行独立的开关操作,现在通过智能音箱来完成对这几个设备的统一控制
类图如下
代码
public class SmartApplicationFacade {
private Light light;
private TV tv;
private AirCondition airCondition;
public SmartApplicationFacade() {
this.light = new Light();
this.tv = new TV();
this.airCondition = new AirCondition();
}
public void say(String msg) {
if (msg.contains("打开")) {
on();
} else if (msg.contains("关闭")) {
off();
} else {
System.out.println("对不起没有听清楚您说什么!请重新说一遍");
}
}
private void off() {
System.out.println("睡觉了");
light.off();
tv.off();
airCondition.off();
}
private void on() {
System.out.println("起床了");
light.on();
tv.on();
airCondition.on();
}
}
总结
- 优点
- 对客户端屏蔽子系统,减少客户端需要处理的对象数目,使子系统使用起来更加容易。通过引入外观模式,客户端代码将变得很简单,与之关联的对象也很少
- 它实现了子系统与客户端之间的松耦合关系,这使得子系统的变化不会影响到调用它的客户端,只需要调整外观类即可
- 一个子系统的修改对其他子系统没有任何影响,而子系统内部变化也不会影响到外观对象。
- 缺点
- 不能很好的控制客户端直接使用子系统类,如果客户端访问子系统类做太多限制则减少了可变性和灵活性。
- 如果设计不当,增加了新的子系统则可能需要修改外观类的源代码,违背了开闭原则。
- 使用场景
- 简化负载系统。比如,当我们开发了一整套的电商系统后(包括订单、商品、支付、会员等系统),我们不能让用户依次使用完这些系统后才完成商品的购买,而是需要一个门户网站或手机App这样的简化过的门面系统来提供在线的购物功能;
- 减少客户端处理的系统数量。比如,在Web应用中,系统与系统之间的调用可能需要处理Database数据库、Model业务对象等,其中使用Dadbase数据库就需要处理打开数据库、关闭连接等操作,然后转换为Model业务对象,实在是太麻烦了。如果能够创建一个数据库使用的门面(其实就是常说的dao层),那么实现以上过程将变得容易很多。
- 联合更多的系统来扩展原有系统。当我们的电商系统中需要一些新功能时,比如,人脸识别,我们可以不需要自行研发,而是购买别家公司的系统来提供服务,这时通过门面系统就能方便快速的进行扩展。
- 作为一个简洁的中间层。门面模式还可以用来隐藏或者封装系统中的分层结构,同事作为一个简化的中间层来使用。比如,在秒杀、库存、钱包等场景中,我们需要共享有状态的数据库时(如商品库存、账户里的钱),在不改变原有系统的前提下,通过一个中间的共享层(如将秒杀活动的商品库存总数统一放在redis中),就能统一进行各种服务(如秒杀详情页、商品详情页、购物车等)的调用。
猜你喜欢
- 2025-04-05 告诉你如何不到一秒完成离线人脸识别,还有防欺骗功能
- 2025-04-05 CompreFace:领先的开源免费开源人脸识别系统
- 2025-04-05 CompreFace — 开源免费的人脸识别!
- 2025-04-05 开源的人脸识别框架(开源的人脸识别框架在哪)
- 2025-04-05 开源人脸识别系统源码推荐(人脸识别开源项目)
- 2025-04-05 java根据端口号杀进程(Linux+Windows)
- 2025-04-05 基于OpenCV的视频人脸识别java考勤jsp源代码Mysql
- 2025-04-05 YOLO v3、FaceNet和SVM的人脸检测识别系统源码(python)分享
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)