外观模式
定义
为子系统中的一组接口(相当与上面的模块)提供一个一致的界面。此模式定义了一个高层接口,这个结口使得这一子系统更加easy使用。说白了就是:我们仅仅需调用高层的函数接口。而不用关心高层内部调用是怎样组合底层方法的。更不用关心底层函数是怎样实现的。
什么是外观模式?
外观模式,很多人也把它叫做门面模式。在GOF的《设计模式:可复用面向对象软件的基础》一书中对外观模式是这样说的:将子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
细细的理解这句话;子系统中的一组接口,就好比上面举得例子中的语法分析,生成中间代码,生成汇编代码,链接成可执行程序或库;外观模式定义的一个高层接口,就好比上面说的Build按钮,通过这样的一个Build按钮,让编译器更加容易使用,对于这一点,从Linux C++/C转Windows C++/C的程序员是最有体会的。visual studio提供的强大功能,只需要一个Build按钮,就可以进行Build动作,而不需要去写makefile文件,然后再去执行一些命令进行编译。
优点
- 减少客户端与系统之间的耦合度;
- 简化客户端代码;
缺点
- 不符合开闭原则,扩张功能需要修改客户端和统一接口的代码;
使用场景
- 客户端与系统存在最大的依赖性;
- 为复杂系统提供一个统一的接口;
参数
- Facade:知道哪些子系统类负责处理请求,并且将客户的请求代理给适当的子系统对象;
- SubSystem:实现子系统具体的功能;处理由Facade对象指派的任务;但是,SubSystem没有Facade的任何相关信息,也就是说,没有指向Facade的指针;
- Client:通过发送请求给Facade的方式与子系统进行通信,而不直接与子系统打交道,Facade将这些消息转发给适当的子系统对象。尽管是子系统中的有关对象在做实际工作,但Facade模式本身也必须将它的接口转换成子系统的接口,这里是不是有点适配器模式的感觉呢?这就是学习结构型设计模式的感觉,感觉都很相似,但是仔细的去研究时,就会发现各自的用处;
示例:顾客下订单,然后餐厅开始做晚饭,外卖员送晚饭,顾客吃晚饭,其中顾客只用下订单即可。
// Cplus_study.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <cstring>
using namespace std;
//餐厅---SubSystem
class Restaurant {
public:
void makeDinner() {
cout << "餐厅做晚饭!\n";
}
};
//外卖员---SubSystem
class Driver {
public:
void sendDinner() {
cout << "外卖员送晚饭!\n";
}
};
//Order---Facade
class Order {
public:
void order() {
cout << "下订单!\n";
restaurant.makeDinner();
driver.sendDinner();
}
private:
Restaurant restaurant;
Driver driver;
};
//Client---Client
class Client {
public:
void eat() {
o.order();
cout << "顾客吃晚饭!\n";
}
private:
Order o;
};
int main(int argc, char *argv[])
{
Client client;
client.eat();
system("pause");
return 0;
}
结果