java设计模式--外观模式

外观模式:为子系统中的一组接口提供一个一致的界面,该模式定义了一个高层接口,这个接口使这个子系统更加容易使用。架构

咱们先看一个使用外观模式的例子,首先定义了三个子系统类ide

public class SubSystemA {
    public void functionA(){
        System.out.println("子系统A方法");
    }
}

public class SubSystemB {
    public void functionB(){
        System.out.println("子系统B方法");
    }
}

public class SubSystemC {
    public void functionC(){
        System.out.println("子系统C方法");
    }
}

使用外观模式定义了一个高层接口,这个接口定义了调用子系统的方法spa

public interface Facade {
    void methodA();
    void methodB();
    void methodC();
}

接口调用子系统的具体实现code

public class FacadeImpl implements Facade {

    private SubSystemA subSystemA;
    private SubSystemB subSystemB;
    private SubSystemC subSystemC;

    public FacadeImpl(){
        subSystemA = new SubSystemA();
        subSystemB = new SubSystemB();
        subSystemC = new SubSystemC();
    }
    @Override
    public void methodA() {
        System.out.println("methodA");
        subSystemA.functionA();
    }

    @Override
    public void methodB() {
        System.out.println("methodB");
        subSystemB.functionB();
        subSystemC.functionC();
    }

    @Override
    public void methodC() {
        System.out.println("methodC");
        subSystemA.functionA();
        subSystemC.functionC();
    }
}

使用外观模式的调用方法blog

public class Test1 {
    public static void main(String[] args) {
        Facade facade = new FacadeImpl();
        facade.methodA();
        facade.methodB();
        facade.methodC();
    }
}

执行结果:接口

methodA
子系统A方法
methodB
子系统B方法
子系统C方法
methodC
子系统A方法
子系统C方法io

 

下面是没有使用外观模式时客户端的调用方法function

public class Test2 {
    public static void main(String[] args) {
        SubSystemA subSystemA = new SubSystemA();
        SubSystemB subSystemB = new SubSystemB();
        SubSystemC subSystemC = new SubSystemC();

        subSystemA.functionA();
        System.out.println("----------------");
        subSystemB.functionB();
        subSystemC.functionC();
        System.out.println("----------------");
        subSystemA.functionA();
        subSystemC.functionC();

    }
}

执行结果:class

子系统A方法
----------------
子系统B方法
子系统C方法
----------------
子系统A方法
子系统C方法service

 

  经过对比咱们能够发现外观模式定义了一个外观类Facade,这个类了解全部子系统的方法和属性,在其内部进行组合后客户端进行调用,若是不使用外观模式,客户端须要去了解全部子系统中的类和属性,有了外观模式,客户端只须要知道外观类Facade就能够了。

咱们常用的三层架构就能够理解为一个外观模式的实例,若是没有service层,咱们的controller层就可能须要直接去关联多个dao才能实现功能,这样就会出现多个controller和dao交叉关联,使系统愈来愈复杂,这时咱们就能够抽象出一层service和dao接口使得耦合程

度下降,除此以外,在维护一个遗留的大型系统时,咱们也能够抽象出一个接口,用这个接口去和这个旧系统交互,新系统只须要与外观类交互,这样能够使得代码维护的复杂程度大大下降。

相关文章
相关标签/搜索