一、外观模式的概念
外观模式为子系统提供一个统一的高层接口,它通过引入一个外观角色来简化客户端与子系统之间的交互,为复杂的子系统调用提供一个统一的入口,降低子系统与客户端的耦合度。
外观角色(Facade):客户端调用这个角色的方法。此角色知晓相关的子系统的功能和责任。正常情况下,本角色会将所有从客户端发来的请求委派到相应的子系统中去。
子系统角色(SubSystem):可以同时有一个或者多个子系统。每个子系统都不是一个单独的类,而是一个类的集合。每一个子系统都可以被客户端直接调用,或者被外观角色直接调用。子系统并不知道门面的存在,对于子系统而言,门面仅仅是另一个客户端。
二、外观模式的实现
//外观角色
public class Facade {
private SubSystemOne subSystemOne;
private SubSystemTwo subSystemTwo;
private SubSystemThree subSystemThree;
private SubSystenFour subSystenFour;
public Facade()
{
this.subSystemOne = new SubSystemOne();
this.subSystemTwo = new SubSystemTwo();
this.subSystemThree = new SubSystemThree();
this.subSystenFour = new SubSystenFour();
}
public void methodA(){
subSystemOne.methodOne();
subSystemTwo.methodTwo();
}
public void methodB(){
subSystemThree.methodThree();
subSystenFour.methodFour();
}
}
/*子系统*/
//One
public class SubSystemOne {
public void methodOne(){
System.out.println("methodOne");
}
}
//Two
public class SubSystemTwo {
public void methodTwo(){
System.out.println("methodTwo");
}
}
//Three
public class SubSystemThree {
public void methodThree(){
System.out.println("methodThree");
}
}
//Four
public class SubSystenFour {
public void methodFour(){
System.out.println("methodFour");
}
}
三、外观模式的应用
- 在层次化结构中,需要定义系统中每一层的入口,使得层与层之间不直接产生联系。
- 维护一个大型遗留系统的时候,可能这个系统已经非常难以维护和扩展,但又包含非常重要的功能,为其开发一个外观类,以便新系统与其交互。
四、外观の其他问题
一个系统可以有多个外观类、抽象外观类的引入(当增加新的子系统或者移除子系统时需要修改外观类,可以通过引入抽象外观类在一定程度上解决该问题,客户端针对抽象外观类进行编程)
五、Reference
六、Resource