外观模式

外观模式

  • 官方定义: 为子系统中的一组接口提供统一的入口, 外观模式定义了一个高层接口, 这个接口使得子系统更易使用
  • 如果没有外观类 那么每个客户端需要和多个子系统之间进行复杂的交互, 系统的耦合度将很大
  • 如果引入外观类后 客户类与系统之间原有的复杂引用关系有外观类来实现,从而降低了系统的耦合度

外观模式核心做两件事

  • 降低原有系统复杂度
  • 降低客户与子系统的耦合度

外观角色(facade)

  • 在客户端可以调用它的方法, 在外观角色中可以知道相关的(一个或者多个)子系统的功能和责任; 在正常情况下, 它将所有从客户端发来的请求委派到相应的子系统, 传递给相应的子系统对象处理

子系统角色(Subsystem)

  • 在软件系统中有一个或者多个子系统角色, 每一个子系统可以不是一个单独的类, 而是一个类的集合, 它实现子系统的功能
  • 每一个子系统都可以被客户端直接调用, 或者被外观角色调用, 它处理有外观类传递过来的请求
  • 子系统并不知道外观类的存在, 对于子系统而言, 外观角色仅仅是另一个客户端而已

代码实现

  • SubSystem1.java
package com.github.pllee1121.designpattern;

public class SubSystem1 {
    public void methon1(){
        System.out.println("子系统 methon1 被调用");
    }
}

  • SubSystem2.java
package com.github.pllee1121.designpattern;

public class SubSystem2 {
    public void methon2(){
        System.out.println("子系统 methon2 被调用");
    }
}

  • SubSystem3.java
package com.github.pllee1121.designpattern;

public class SubSystem3 {
    public void methon3(){
        System.out.println("子系统 methon3 被调用");
    }
}

  • Facade.java
package com.github.pllee1121.designpattern;

public class Facade {
     SubSystem1 s1 = new SubSystem1();
     SubSystem2 s2 = new SubSystem2();
     SubSystem3 s3 = new SubSystem3();

    public void method(){
        s1.methon1();
        s2.methon2();
        s3.methon3();
    }
}
  • Driver.java
package com.github.pllee1121.designpattern;

public class Driver {
    public static void main(String[] args) {
        Facade f = new Facade();
        f.method();
    }
}

外观模式的使用范围

  • 当要为==访问一系列复杂的子系统==提供==一个简单入口==时,可以使用外观模式
  • ==客户端程序与多个子系统之间==存在很大的==依赖性==,==引入外观类==可以将子系统与客户端==结耦==,从而提高子系统的==独立性和可移植性==
  • 在==层次化结构==中,可以==使用外观模式定义系统中==每一层的入口,层与层之间不直接产生联系,而==通过外观类==建立联系,==降低层之间的耦合度==

你可能感兴趣的:(外观模式)