[设计模式]结构模式-外观模式(C++描述)
[设计模式]结构模式-外观模式(C++描述)
1. 什么是外观模式
外观模式为子系统中的各类提供了一个统一简明的外观,隐藏了子系统的复杂性,使子系统更加容易使用。
简单地说:把多个类进行统一,组合成新接口,供上层使用。
如:A类,B类,C类,对于客户来说,并不需要知道他们在哪,客户只需知道新类D,通过D能调用到A,B,C类的功能。
在实际开发中,外观模式运用非常广泛。
2. 外观模式结构图
分析:
子系统角色类:SubSystem1,SubSystem2,不同的子系统实现不同的功能
外观角色类:组合了多种子系统,并对外提供统一的接口
代码:
// 现有功能类1
class SubSystem1
{
public:
SubSystem1(){}
~SubSystem1(){}
void Operation(){}
};
// 现有功能类2
class SubSystem2
{
public:
SubSystem2(){}
~SubSystem2(){}
void Operation(){}
};
// 在不改变现有类的情况下,使用外观模式,新建新类
// 使得客户无须关心复杂系统城的多个类,而直接调用
class Facade
{
public:
Facade()
{
_subSystem1 = new SubSystem1();
_subSystem2 = new SubSystem2();
}
~Facade()
{
delete _subSystem1;
delete _subSystem2;
}
void OperationWrapper()
{
subSystem1->Operation();
subSystem2->Operation();
};
private:
SubSystem2 _subSystem2;
SubSystem1 _subSystem1;
};
// 使用,客户无须知道内部具体怎么复杂实现
Facade * f = new Facade();
f->OperationWrapper();
外观模式在高层提供了一个统一的接口,解耦了系统。
2.1优点
1. 它对客户屏蔽了子系统内部的实现,减少了客户处理对象的数目,更加方便
2. 它实现了子系统与客户之间松耦合的关系,子系统内部是紧耦合关系。
3. 如果应用需要,可以直接调用子系统类,可以在系统易用性和通用性之间选择。
2.2缺点
1. 不能限制客户使用外观类还是子系统类
2. 新增子系统,需修改外观类,不符合开闭原则
3 外观模式应用
外观模式应用非常广泛,如下
1. 为一个复杂的子系统提供提一个简单的接口时。
2. 引入外观模式可以将客户与子系统分离,提高子系统的独立性和可移植。
3. 当需要构建一个层次结构的子系统时,使用外观模式定义子系统的入口。
4 例子
1. 代码生成工具,功能包括:表现在代码生成,逻辑层代码生成,数据层代码生成,配置数据生成。可以提一个统一的外观类,里面包含一个makeCode(),自动生成代码即可
2. 客户的某一调用流程需通过ServiceA,ServiceB,ServiceC,可以提供一个外观类,封装好ServiceFacade,让外观类统一处理,客户无须知道里面具体有多少其他服务。
4 总结
外观模式是运用非常多的模式,在平时项目里,旧的类库或已上线的类库,是不能随便修改的,如果涉及到多个类库同时服务,或在旧类库的具体上添加新的服务,即会用上外观模式,使系统变得更容易扩展和维护,同时也不会影响到原有上线的产品。
简单,好用,易扩展,可维护,是外观模式的特点。