java设计模式--外观模式

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

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

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方法");
    }
}

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

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

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

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();
    }
}

使用外观模式的调用方法

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方法

 

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

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();

    }
}

执行结果:

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

 

  通过对比我们可以发现外观模式定义了一个外观类Facade,这个类了解所有子系统的方法和属性,在其内部进行组合后客户端进行调用,如果不使用外观模式,客户端需要去了解所有子系统中的类和属性,有了外观模式,客户端只需要知道外观类Facade就可以了。

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

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

点赞