一.定义
是一种为多个复杂子系统提供一个一致的接口,从而让这些子系统能够更加容易被访问的模式。该模式对外有一个统一的接口,外部不用关注内部的实现细节,这样降低了系统复杂度,提高可维护度。
外观模式就是“迪米特法则”的典型应用
二.结构
外观角色:为多个子系统提供一个共同的接口
子系统角色:实现系统的部分功能,客户可以通过外观角色访问。
三.例
/**
* 外观角色
*/
public class Facade {
private A a;
private B b;
public Facade() {
this.a = new A();
this.b = new B();
}
public void print(){
a.print();
b.print();
}
}
/**
* 子系统角色
*/
public class A {
public void print(){
System.out.println("A");
}
}
/**
* 子系统角色
*/
public class B {
public void print(){
System.out.println("B");
}
}
好处:
降低了子系统与客户端之间的耦合度。
对子系统进行了封装,客户端不需要知道其实现逻辑,降低了系统复杂度。
缺点:
当需要增加子系统时,违反了开闭原则。
四.使用场景
1.当一个复杂的系统的子系统很多时,外观模式可以为系统设计一个简单的接口访问。
2.子系统与客户端有很大联系时,可以进行分离,降低耦合度。
3.对分层结构系统构建时,使用外观模式定义子系统中每层的入口点可以简化子系统之间的依赖关系(“迪米特法则”)。
总结
外观模式体现了封装性,在我们平时的使用中都会使用到外观模式。一个功能的实现很可能会依赖多个类中的功能,这就体现了外观模式。