概念:
又称门面模式,隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。
外部应用程序不用关心内部子系统的具体的细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。
这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用。
外观模式是“迪米特法则”的典型应用。
结构:
外观(Facade)角色:为多个子系统对外提供一个共同的接口。
子系统(Sub System)角色:实现系统的部分功能,客户可以通过外观角色访问它。
实现案例:
以实现一个系统的简单架构为例,客户端需要使用三个子系统(HttpRequest、ImageLoader、Common)提供的功能方法,这里用外观类(Facade),对这些子系统进行委托调用。
//子系统1
public class HttpRequest {
public void init() {
System.out.println("初始化... HttpRequest");
}
public void request() {
System.out.println("执行网络请求... http");
}
}
//子系统2
public class ImageLoader {
public void init() {
System.out.println("初始化... ImageLoader");
}
public void load() {
System.out.println("加载图片...image");
}
}
//子系统3
public class Common {
public void init() {
System.out.println("初始化... Common");
}
public void method() {
System.out.println("执行公共方法... common");
}
}
//外观类
public class Facade {
private Common common;
private HttpRequest httpRequest;
private ImageLoader imageLoader;
public Facade() {
common = new Common();
httpRequest = new HttpRequest();
imageLoader = new ImageLoader();
}
public void init() {
common.init();
httpRequest.init();
imageLoader.init();
}
public void httpRequest() {
httpRequest.request();
}
public void loadImage() {
imageLoader.load();
}
public void commonMethod() {
common.method();
}
}
public class Test {
public static void main(String[] args) {
Facade facade = new Facade();
facade.init();
System.out.println(">>>>>>>>>>>>>>>>>");
facade.httpRequest();
facade.commonMethod();
facade.loadImage();
}
}
系统设计常用的一种模式,案例中Facade聚合了各个子系统,并对子系统的功能方法对外提供了统一的封装。
优点:
1、减少系统相互依赖。
2、提高灵活性。
3、提高了安全性。
缺点:
不符合开闭原则,修改起来很麻烦。
使用场景:
1、当一个复杂系统的子系统很多时,外观模式可以为系统设计一个简单的接口供外界访问。
2、当客户端与多个子系统之间存在很大的联系时,引入外观模式可将它们分离,从而提高子系统的独立性和可移植性。