(结构型模式)Facade——外观模式
1、意图
外观模式:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
2、核心思想
外部与一个子系统的通信必须通过一个统一的外观对象进行。外观模式提供一个高层次的接口,使得子系统更易于使用。每一个子系统只有一个外观类,而且此外观类只有一个实例,也就是还说它是一个单例模式。但整个系统可以有多个外观类。
3、优缺点分析
GOOD:
为子系统的一组接口提供一个一致的界面。使用户使用起来更加方便。
完美体现了依赖倒转原则和迪米特原则
适用情况:
分三个阶段:
1、首先,在设计初期阶段,应该有意识的将不同的两个层分离,即在层与层之间建立外观Facade
2、其次,在开发阶段,子系统往往因为不断的重构演化,而变得越来越复杂,增加外观Facade可以提供一个简单的接口,减少它们之间的依赖。
3、在维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展了,就可以为新系统开发一个外观Facade类,来提供设计粗糙或高度复杂的遗留代码的比较清晰简单的接口,让新系统与Facade对象交互,Facade与遗留代码交互所有复杂的工作。
4、标准UML图
外观类:
Facade:知道哪些子系统类负责处理请求,将客户的请求代理给适当的子系统对象。所以它需要了解所有的子系统的方法或属性,进行组合,以备外界调用。
(与外观类相关联)子系统类集合:
SubSystem Classes:实现了子系统的具体功能,处理Facade对象指派的任务。(注意:子系统类中没有任何Facade的信息,既没有对Facade对象进行引用)
5、标准源码
1: #include<iostream>
2: #include <string>
3: using namespace std;
4:
5: class SubSysOne
6: {
7: public:
8: void MethodOne()
9: {
10: cout<<"方法一"<<endl;
11: }
12: };
13:
14: class SubSysTwo
15: {
16: public:
17: void MethodTwo()
18: {
19: cout<<"方法二"<<endl;
20: }
21: };
22:
23: class SubSysThree
24: {
25: public:
26: void MethodThree()
27: {
28: cout<<"方法三"<<endl;
29: }
30: };
31:
32: //外观类
33: class Facade
34: {
35: private:
36: SubSysOne* sub1;
37: SubSysTwo* sub2;
38: SubSysThree* sub3;
39: public:
40: Facade()
41: {
42: sub1 = new SubSysOne();
43: sub2 = new SubSysTwo();
44: sub3 = new SubSysThree();
45: }
46: ~Facade()
47: {
48: delete sub1;
49: delete sub2;
50: delete sub3;
51: }
52:
53: void FacadeMethod()
54: {
55: sub1->MethodOne();
56: sub2->MethodTwo();
57: sub3->MethodThree();
58: }
59: };
60:
61: //客户端
62: int main()
63: {
64: Facade* test = new Facade();
65: test->FacadeMethod();
66: return 0;
67: }