设计模式——结构型模式(五)

Facade(外观模式)

目标

为子系统中的一组接口提供一个一致界面,定义一个可以试子系统更加容易使用的高级接口。

结构

结构图

客户在一个统一的高级接口的调用下完成了对完全解耦的子系统的调用,以避免用户对子系统细节的直接参与等。

协作

时序图

Client类通过对Facade接口的创建统一地对子系统下的各文件进行创建,并且在调用一个Facade提供的方法之后,由Facade接口统一地调度进行操作子系统中相应的方法。Client从而不会直接访问子程序。

适用情形

  1. 需要为一个复杂的子系统提供一个简单的接口。有时候子系统可能随着演化变得非常复杂以及可复用,此时对于一些只需要基本操作的用户来说可以使用Facade提供的接口进行简单的操作。如果是需要高级操作的用户,可以跳过Facade直接对子系统进行操作即可;

  2. Facade接口可以降低子系统与Client类之间的依赖性,降低系统的耦合度;

  3. 当需要创建一个具有层次结构的系统时,可以使用Facade来定义子系统中每层的入口。从而让子系统之间只通过Facade进行通讯从而简化他们之间的依赖关系。

参与者

  • Facade

    知道子系统的具体方法与接口,并且将客户端的请求转发给相应的子系统对象。

  • Subsystem classes

    实现子系统的功能、完成Facade指派的任务,并且不会包含Facade对象的任何信息。

效果

  1. 对客户屏蔽子系统组建,以减少客户处理的对象的数目并且使用户使用子系统更加方便;

  2. 实现子系统与客户之间的松耦合关系,由于子系统之间的操作往往是紧耦合的,这样可以降低对子系统进行修改之后对客户的修改;

  3. 可以在用户需要的时候开放相应的子系统以便用户实施高级操作。

  4. 私有化子系统类,我们往往并不是希望所有的子系统类都是用户可以高级定制的。此时可以通过私有化类,从而让某些公用类暴露,其他的类将会对客户不可见。

代码示例

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
53
54
55
56
57
58
59
class AutomaticTransmission{
private FirstGear firstGear;
private SecondGear secondGear;
public AutomaticTransmission() {
firstGear = new FirstGear();
secondGear = new SecondGear();
}
public void drive() {
firstGear.drive();
secondGear.drive();
}
}
class FirstGear{
public void drive() {
System.out.println("At first gear!");
}
}
class SecondGear{
public void drive() {
System.out.println("At first gear!");
}
}
class C1Driver{
private AutomaticTransmission auto;
private FirstGear firstGear;
private SecondGear secondGear;
public C1Driver() {
auto = new AutomaticTransmission();
firstGear = new FirstGear();
secondGear = new SecondGear();
}
public void driveAuto() {
auto.drive();
}
public void driveManual() {
firstGear.drive();
secondGear.drive();
}
}
class C2Driver{
private AutomaticTransmission auto;
public C2Driver() {
auto = new AutomaticTransmission();
}
public void driveAuto() {
auto.drive();
}
}

Powered by Hexo and Hexo-theme-hiker

Copyright © 2013 - 2018 Alex's Blog All Rights Reserved.

Yifeng Tang hält Urheberrechtsansprüche.