阅读 29

DesignPattern - 外观模式【结构型】

欢迎关注微信公众号:FSA全栈行动 👋

一、外观模式介绍

外观模式(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);
	}
}
复制代码

如果文章对您有所帮助, 请不吝点击关注一下我的微信公众号:FSA全栈行动, 这将是对我最大的激励. 公众号不仅有Android技术, 还有iOS, Python等文章, 可能有你想要了解的技能知识点哦~

文章分类
代码人生
文章标签