外观模式定义与特点
外观模式又叫作门面(Facade)模式,为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
外观(Facade)模式是迪米特法则的典型应用,它有以下主要优点。
- 降低了子系统与客户端之间的耦合度,使得子系统的变化不会影响调用它的客户类。
- 对客户屏蔽了子系统组件,减少了客户处理的对象数目,并使得子系统使用起来更加容易。
- 降低了大型软件系统中的编译依赖性,简化了系统在不同平台之间的移植过程,因为编译一个子系统不会影响其他的子系统,也不会影响外观对象。
外观(Facade)模式的主要缺点如下。
- 不能很好地限制客户使用子系统类,很容易带来未知风险。
- 增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”。
外观模式使用场景
- 为复杂子系统提供一个接口,使得耦合大大降低。在开发阶段,子系统往往因为不断的重构演化变得越来越复杂,大多数的模式使用时也会产生很多很小的类,给外部调用它们的用户程序带来了使用上的困难,增加外观模式可以提供一个简单的接口,减少它们之间的依赖。
- 在维护一个遗留的大型系统时,可能这个系统以及难以维护和扩展了,但新需求开发必须依赖于它。此时可以为新系统开发一个外观 Facade 类,为设计粗糙或高度复杂的遗留代码设计比较清晰的简单的接口,让新系统与 Facade 对象交互,Facade 与遗留代码交互多远复杂的工作。
外观模式的 UML 类图
/**
* 子系统角色
*/
public class SubSystemOne {
public void methodOne() {
System.out.println("子系统01的 methodOne()被调用!");
}
}
/**
* 子系统角色
*/
public class SubSystemTwo {
public void methodTwo() {
System.out.println("子系统02的 methodTwo()被调用!");
}
}
/**
* 子系统角色
*/
public class SubSystemThree {
public void methodThree() {
System.out.println("子系统03的 methodThree()被调用!");
}
}
/**
* 子系统角色
*/
public class SubSystemFour {
public void methodFour() {
System.out.println("子系统04的 methodFour()被调用!");
}
}
/**
* 外观类
*/
public class Facade {
private SubSystemOne subSystemOne;
private SubSystemTwo subSystemTwo;
private SubSystemThree subSystemThree;
private SubSystemFour subSystemFour;
public Facade() {
subSystemOne = new SubSystemOne();
subSystemTwo = new SubSystemTwo();
subSystemThree = new SubSystemThree();
subSystemFour = new SubSystemFour();
}
public void methodA() {
System.out.println("方法组A---------");
subSystemOne.methodOne();
subSystemTwo.methodTwo();
subSystemFour.methodFour();
}
public void methodB() {
System.out.println("方法组B---------");
subSystemTwo.methodTwo();
subSystemThree.methodThree();
}
}
/**
* 客户类
*/
public class Client {
public static void main(String[] args) {
Facade facade = new Facade();
facade.methodA();
facade.methodB();
}
}
程序运行结果如下:
方法组A---------
子系统01的 methodOne()被调用!
子系统02的 methodTwo()被调用!
子系统04的 methodFour()被调用!
方法组B---------
子系统02的 methodTwo()被调用!
子系统03的 methodThree()被调用!
网友评论