DesignPattern - 外观模式【结构型】
# 一、外观模式介绍
外观模式(Facade Pattern)又叫门面模式,隐藏系统的复杂性,定义一个高层接口,供客户端(也就是使用者)访问,该接口使得系统更加容易使用。
- 核心组成
- 外观角色(Facade):客户端可以调用这个角色的方法,这个外观方法知道多个子系统的功能和实际调用
- 子系统角色(SubSystem):每个子系统都可以被客户端直接调用,子系统不知道门面的存在
- 应用场景
- MVC 三层架构中,各层之间使用 interface 接口进行交互,不用担心内部逻辑,降低耦合性
- 各种第三方 SDK 大多会使用外观模式,通过一个外观类,也就是整个系统的接口只有一个统一的高层接口,这对用户屏蔽了很多实现细节,外观模式经常用在封闭 API 的常用手段
- 对于复杂难以维护的老系统进行拓展,可以使用外观模式
- 需要对一个复杂的模块或子系统提供一个外界访问的接口,外界对子系统的访问只要黑盒操作
- 优点
- 减少了系统的相互依赖,提高了灵活性
- 符合依赖倒转原则:针对接口编程,依赖于抽象而不依赖于具体
- 符合迪米特法则:最少知道原则,一个实体应当尽量少地与其他实体之间发生相互作用
- 缺点
- 增加了系统的类和链路
- 不是很符合开闭原则,如果增加了新的逻辑,需要修改 facade 外观类
# 二、外观模式代码实现
创建子系统接口:
说明:该接口非必须,根据需要创建
public interface IMsgManager {
void pushMsg(String msg);
}
创建子系统类:
说明:子系统不要求一定是同一类的,比如:用户登录子系统,余额查询子系统 等等
/**
* 子系统角色:微信消息推送
*
* @author GitLqr
*/
public class WechatMsgManager implements IMsgManager {
@Override
public void pushMsg(String msg) {
System.out.println("发送微信推送消息:" + msg);
}
}
/**
* 子系统角色:钉钉消息推送
*
* @author GitLqr
*/
public class DingDingMsgManager implements IMsgManager {
@Override
public void pushMsg(String msg) {
System.out.println("发送钉钉推送消息:" + msg);
}
}
创建外观类:
/**
* 外观类:整合所有子系统,封装一个高层接口
*
* @author GitLqr
*/
public class MsgManagerFacade implements IMsgManager {
private IMsgManager wechatMsgManager = new WechatMsgManager();
private IMsgManager dingDingMsgManager = new DingDingMsgManager();
@Override
public void pushMsg(String msg) {
wechatMsgManager.pushMsg(msg);
dingDingMsgManager.pushMsg(msg);
}
}
- 01
- Flutter - 危!3.24版本苹果审核被拒!11-13
- 02
- Flutter - 轻松搞定炫酷视差(Parallax)效果09-21
- 03
- Flutter - 轻松实现PageView卡片偏移效果09-08