首页 > 代码库 > 设计模式之外观模式

设计模式之外观模式

外观模式

  外观模式核心就是为系统提供一个统一的入口,封装子系统的复杂性,便于客户端使用。

外观模式结构图

技术分享

  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)测试结果

  技术分享

使用场景

  • 为一个复杂的系统提供一个简单的接口;
  • 客户端和多个子系统之间存在很大的依赖性。使用外观模式,可以实现客户端和子系统之间的解耦,提高子系统的独立性和可抑制性;

外观模式优缺点

  • 优点
    • 外观模式使得客户端和子程序解耦,实现松耦合的关系
    • 简化系统的相互依赖性,增大子系统的可移植性;
  • 缺点
    • 如果增加系统可能需要修改外观类或子系统的代码,违反”开闭原则“;
    • 如果外观类对子程序做过多限制,减少了子系统的灵活性和可变性;

设计模式之外观模式