Earth Guardian

You are not LATE!You are not EARLY!

0%

设计模式--结构型:外观模式

外观模式:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用

外观模式 Facade [fəˈsɑːd] :描述如何用单个对象表示整个子系统。为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口。体现了依赖倒转原则,典型场景: MVC 架构、基金对股票的封装等。

外观模式 Facade

类图结构

0056-Facade-uml-classdiag.png

结构解析

  • Facade
    系统对外的统一接口。
  • SubSystem1/SubSystem2/SubSystem3
    子系统及对应的功能实现。

类图可以看出,所有的类关系都仅仅是简单关联,外观模式主要体现在对外接口的统一,以及对内整个系统的封装。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
// 1. SubSystem
public class SubSystem1 {
public void operation1(){
System.out.println("SubSystem1::operation1.");
}
}

public class SubSystem2 {
public void operation2(){
System.out.println("SubSystem2::operation2.");
}
}

public class SubSystem3 {
public void operation3(){
System.out.println("SubSystem3::operation3.");
}
}

// 2. Facade
public class Facade {
private SubSystem1 subSystem1;
private SubSystem2 subSystem2;
private SubSystem3 subSystem3;

public Facade() {
subSystem1 = new SubSystem1();
subSystem2 = new SubSystem2();
subSystem3 = new SubSystem3();
}

public void method(){
System.out.println("Facade::method.");
subSystem1.operation1();
subSystem2.operation2();
subSystem3.operation3();
}
}

// 3. Test
public class TestFacade {
public static void main(String[] args) {
Facade facade = new Facade();
facade.method();
}
}

// 4. Result
Facade::method.
SubSystem1::operation1.
SubSystem2::operation2.
SubSystem3::operation3.

总结

外观模式隐藏了子系统的复杂性,通过高层次的结构提供统一的接口。在设计初期尽量使用外观模式来分层;开发过程中子系统越来越复杂时,外观模式提供一个统一简单的接口降低耦合性;项目后期可以通过外观类封装系统遗留代码,对外操作大大简化。

  • 优点
    对客户隐藏子系统细节,简述客户端和子系统的耦合性;对子系统封装接口,使得系统易用。
  • 缺点
    子系统所有的接口都通过外观类对外暴露,导致外观类功能过多;如果不引入抽象外观类,业务变更或者增加子系统时需要修改外观类或者客户端,不符合开闭原则。

参考文档

  • 大话设计模式
  • Android 源码设计模式解析与实战
  • 外观模式