外观模式
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的工作原理有点类似,都是有一个统一的对外门面,客户端只需要与门面对接,门面接收到请求后,转发给相应的子系统进行请求处理。
外观模式跟简单工厂模式或者工厂模式不一样哦,这里不要搞混了。简单工厂模式或工厂模式针对的子类都是有共同的父类接口的,各个子类由统一的父类继承演化而来。而外观模式封装的各个子类,他们之间是没有什么关系的,都是相互独立的系统,这点需要特别注意一下。