Facade Pattern
外观模式
生活中的例子:(1)通过总开关,接入和切断电源(2)网站导航
主要思想:定义一个外观类(外覆器),为子系统的一组接口提供统一的接口。在这些子系统和使用子系统的客户之间建立一层“缓冲层”,这个缓冲层接收客户的访问请求,然后将任务分配到诸子系统中。
外观模式之前:
class Com_1 { public: void run(); } ;
class Com_2 { public: void run(); } ;
class Com_3 { public: void run(); } ;
class Com_4 { public: void run(); } ;
class System {
private:
std::shared_ptr<Com_1> ptr_1;
std::shared_ptr<Com_2> ptr_2;
std::shared_ptr<Com_3> ptr_3;
std::shared_ptr<Com_4> ptr_4;
public:
void run() {
// 逻辑判断, 合法性检验, 前期准备工作
ptr_1->run();
ptr_2->run();
ptr_3->run();
ptr_4->run();
// 后期清理工作等
}
} ;
如果有多次集体的 run 行动,每次都需要书写一遍 run, 如果子系统数量增多,将变得复杂。
而且,逻辑和实现耦合在一起。
使用外观模式之后:
class Com_1 { public: void run(); } ;
class Com_2 { public: void run(); } ;
class Com_3 { public: void run(); } ;
class Com_4 { public: void run(); } ;
class Facade {
private:
std::shared_ptr<Com_1> ptr_1;
std::shared_ptr<Com_2> ptr_2;
std::shared_ptr<Com_3> ptr_3;
std::shared_ptr<Com_4> ptr_4;
public:
void run() {
assert(ptr_1 and ptr_2 and ptr_3 and ptr_4);
ptr_1->run();
ptr_2->run();
ptr_3->run();
ptr_4->run();
}
} ;
class System {
private:
std::shared_ptr<Facade> ptr;
public:
void run() {
// 前期准备工作, 逻辑判断等
ptr->run();
// 后期清理工作
}
} ;
优点:(1)做到逻辑和实现分离(2)简化了书写难度,每次集体 run(包括其他操作),都可以用 外观类 Facade 的一次操作完成,适合多个子系统的情况。(3)如果子系统发生更改,只会影响到外观类,而不会影响到 System 系统类。
缺点:(1)增加了一层间接访问性(2)空间上有一个 std::shared_ptr (或者其他引用的损失)。
和适配器模式的区别:(1)适配器模式是为了调用不兼容的的接口,针对单个类;外观模式针对的是多个子系统,提供一个统一访问的接口。