UML类图(仅供参考)如下:
外观模式解决的问题:
为了达到一个稍微复杂点的功能(或者是实现一个简单的功能的过程比较复杂),需要调用几个对象方法来实现,但是调用者不想关心这个功能到底是怎么实现的,或者是为了降低这个调用者和这些对象之间的耦合度,我们可以重新定义一个新的类A(外观模式)来包装这个功能,调用者只需要知道类A就行,相当于提供了一个一致界面
源码
#include <iostream>
// 子工作1
class Sub_Work1
{
public:
void Working1()
{
std::cout << "Doing Sub-Work1..." << std::endl;
}
};
// 子工作2
class Sub_Work2
{
public:
void Working2()
{
std::cout << "Doing Sub-Work2..." << std::endl;
}
};
// 子工作3
class Sub_Work3
{
public:
void Working3()
{
std::cout << "Doing Sub-Work3..." << std::endl;
}
};
// 子工作4
class Sub_Work4
{
public:
void Working4()
{
std::cout << "Doing Sub-Work4..." << std::endl;
}
};
// 总工作,客户与之打交道
// 外观模式类
class CFacade
{
private:
Sub_Work1 w1;
Sub_Work2 w2;
Sub_Work3 w3;
Sub_Work4 w4;
public:
// 总工作1,整合一个功能
// 如果这个功能内部实现有变化
// 只需要改变方法内部实现,调用者不变
void Work1()
{
// 具体的实现方式
w1.Working1();
w3.Working3();
}
// 总工作2
void Work2()
{
w2.Working2();
w3.Working3();
w4.Working4();
}
};
// 测试
int main()
{
CFacade w;
/*******总工作1******/
std::cout << "开始调用总工作1" << std::endl;
w.Work1();
/*******总工作2******/
std::cout << std::endl << "开始调用总工作2" << std::endl;
w.Work2();
return 0;
}
好处
1、减少系统相互依赖
2、提高灵活性