设计模式之外观模式
外观模式
外观模式核心就是为系统提供一个统一的入口,封装子系统的复杂性,便于客户端使用。
外观模式结构图
Client:客户端
Facade:外观类,提供统一的接口,根据不同的请求,调用不同的子系统处理;
Subsystem:子系统类,处理不同的子系统模块业务;
举例说明
如果我们要实现一个注册公司的模块。需要和工商局+银行+质监局+税务局打交道;
但是我们可以通过代理注册公司(外观类)去帮我们处理一系列的流程:
代码实现
(1)子系统
/** * SubSystemA 工商局 * @author yangkj*/ public class SubSystemA { public void regist(String message) { System.out.println("工商局注册:" + message); } } /** * SubSystemB 银行 * @author yangkj*/ class SubSystemB { public void regist(String message) { System.out.println("银行注册:" + message); } } /** * SubSystemC 质检局 * @author yangkj*/ class SubSystemC { public void regist(String message) { System.out.println("质检局注册:" + message); } } /** * SubSystemD 税务局 * @author yangkj*/ class SubSystemD { public void regist(String message) { System.out.println("税务局注册:" + message); } }
(2)外观类
/** * Facade 外观类 * @author yangkj*/ public class Facade { public void regist(String message){ SubSystemA a = new SubSystemA(); a.regist(message); SubSystemB b = new SubSystemB(); b.regist(message); SubSystemC c = new SubSystemC(); c.regist(message); SubSystemD d = new SubSystemD(); d.regist(message); } }
(3)客户端
/** * Client * @author yangkj*/ public class Client { public static void main(String[] args) { Facade facade = new Facade(); facade.regist("alibaba"); } }
(4)测试结果
使用场景
- 为一个复杂的系统提供一个简单的接口;
- 客户端和多个子系统之间存在很大的依赖性。使用外观模式,可以实现客户端和子系统之间的解耦,提高子系统的独立性和可抑制性;
外观模式优缺点
- 优点
- 外观模式使得客户端和子程序解耦,实现松耦合的关系
- 简化系统的相互依赖性,增大子系统的可移植性;
- 缺点
- 如果增加系统可能需要修改外观类或子系统的代码,违反”开闭原则“;
- 如果外观类对子程序做过多限制,减少了子系统的灵活性和可变性;