Java设计模式-外观模式

121 阅读2分钟

外观模式

1.外观模式含义

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

外观模式的含义看起来晦涩难懂,但其实类比一下就比较好理解了。假设现在我们需要买股票,那么我们就需要自己去了解股票的相关知识,自己研究哪些股票好一点,哪些股票不太行。这样对我们来说消耗巨大,成本极高。但是如果我们换个法子改去买基金,那么我们只需要知道这一个基金的盈亏情况即可,至于这些基金要去买哪些股票,买股票要注意哪些事情,这些复杂的事情都不需要我们自己操心,基金经理就帮我们都解决了这些事情。

在这个例子中,股票就是每一个独立的子系统,基金经理就是外观类,外观类将子系统统一封装,对外提供服务,客户端只需要对接外观类一个服务即可,而不再需要自己去对接每一个独立的子系统。

2.代码示例

2.1子系统1代码

public class SubSystemOne {
    public void methodOne(){
        System.out.println("子系统方法1");
    }
}

2.2子系统2代码

public class SubSystemTwo {
    public void methodTwo(){
        System.out.println("子系统方法2");
    }
}

2.3子系统3代码

public class SubSystemThree {
    public void methodThree(){
        System.out.println("子系统方法3");
    }
}

2.4外观类代码

public class Facade {
    private SubSystemOne subSystemOne;
    private SubSystemTwo subSystemTwo;
    private SubSystemThree subSystemThree;

    public Facade() {
        subSystemOne = new SubSystemOne();
        subSystemTwo = new SubSystemTwo();
        subSystemThree = new SubSystemThree();
    }

    public void methodA(){
        System.out.println("方法组A()---------------");
        subSystemOne.methodOne();
        subSystemTwo.methodTwo();
    }

    public void methodB(){
        System.out.println("方法组B()------------------");
        subSystemThree.methodThree();
    }
}

2.5测试类

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

运行结果

方法组B()------------------
子系统方法3

3.外观模式UML类图

4.总结

外观模式还是比较好理解的,它就是为很多个独立的子系统提供一个统一对外的外观门面,免去了客户端与各对子系统对接的麻烦,改为与外观门面统一对接,简化了对接逻辑,降低了代码的维护成本。

其实外观模式的原理和nginx的工作原理有点类似,都是有一个统一的对外门面,客户端只需要与门面对接,门面接收到请求后,转发给相应的子系统进行请求处理。

外观模式跟简单工厂模式或者工厂模式不一样哦,这里不要搞混了。简单工厂模式或工厂模式针对的子类都是有共同的父类接口的,各个子类由统一的父类继承演化而来。而外观模式封装的各个子类,他们之间是没有什么关系的,都是相互独立的系统,这点需要特别注意一下。