这次讲一个外观模式,与我们理解的UI是有不同的。外观模式为我们的子系统制定一套统一的接口,这些接口是为了方便用户不会因为子系统的变更而需要改变高层程序而设计的。引用GOF的原话的话,就是:”为子系统中的一组接口提供一个一致的界面, Facade 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。”
且看结构图:
从上述的结构图中可以获知,我们的外观模式其实就是一种统一接口,至于接口之外的系统功能变化,我们可以不做理会。只要接口的功能没有太多的变化,能够不让高层的程序进行变动,就可以认为是外观模式。
适用性:
1 .为一个复杂子系统提供一个简单接口。
2 .提高子系统的独立性。
3 .在层次化结构中,可以使用 Facade 模式定义系统中每一层的入口。
Facade模式的几个要点:
从客户程序的角度来看,Facade模式不仅简化了整个组件系统的接口,同时对于组件内部与外部客户程序来说,从某种程度上也达到了一种“解耦”的效果----内部子系统的任何变化不会影响到Facade接口的变化。
对于这个模式的理解也比较容易,通过一个简短的例子来展示一下吧!
//客户类
#include <iostream>
#include <Windows.h>
using namespace std;
class Client
{
public:
char* m_customName;
int m_age;
char* m_address;
private:
};
//关联类A
class A
{
public:
voidGetUserAge(Client c);
};
//关联类B
class B
{
public:
voidGetClientName(Client usr);
};
//关联类C
class C
{
public:
BOOLGetAddress(Client c);
};
//main文件
#include "Facade.h"
#include <iostream>
using namespace std;
void main()
{
Clientcustom;
custom.m_address = "曼哈顿大街号";
custom.m_age = 24;
custom.m_customName= "helinlin";
A*a = new A;
B*b = new B;
C*c = new C;
a->GetUserAge(custom);
b->GetClientName(custom);
c->GetAddress(custom);}
从main文件中可以看出来,当A,B,C三个类都调用到了Client 的信息,而Client要完成一个完整的一个流程处理,则需要和A、B、C三个类均产生耦合,这样的程序耦合度太高,封装性太差。外观模式的作用在于在A、B、C三个类的上层进行一层封装,是的Client的调用不用直接和A、B、C三个进行关联。从而完成对数据的封装。
我们的外观封装类如下:
class Merge
{
public:
void DelClient(Client custom);
private:
A *a;
B *b;
C *c;
};
void Merge::DelClient( Client custom )
{
a = new A;
b = new B;
c = new C ;
a->GetUserAge(custom);
b->GetClientName(custom);
c->GetAddress(custom);
}
运行结果不改变。
从上述程序可以看出,我们添加了封装的外观类进行接口的统一封装,使得数据的耦合度大大降低,至少从客户的角度上来看,可以使得操作变得简单化。