装饰者:不改变接口,但加入责任
适配器:将一个接口转换成另一个接口
外观:让接口更简单
外观模式:将一个或数个类的复杂的一切都隐藏在背后,只显露出一个干净美好的外观。外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观模式定义了一个高层接口,让子系统更容易使用。
案例:假设你现在准备挑选一部DVD影片准备观看,你需要做一系列的步骤:将灯光调暗、放下屏幕、打开投影机、将投影机切换到DVD模式、播放视频等等。观看完以后又要反向进行一遍,整个过程涉及到太多的类和类的方法。使用外观模式就可以将这些复杂的步骤变得简单使用。
设计原则:
最少知道原则,又称迪米特法则。减少代码臃肿,不要让太多的类耦合在一起。
注意:1.外观模式只是简化了接口,并没有把子系统的接口封装起来。如果需要,也可以直接去访问子系统的接口。
2.外观不仅是简化了接口,也将客户从组件的子系统中解耦。
类图:
实现如下:
light.h:
#ifndef LIGHT_H
#define LIGHT_H
#include <iostream>
using namespace std;
class Light {
public:
void up()
{
cout << "灯光调亮" << endl;
}
void down()
{
cout << "灯光调暗" << endl;
}
};
#endif // LIGHT_H
screen.h:
#ifndef SCREEN_H
#define SCREEN_H
#include <iostream>
using namespace std;
class Screen {
public:
void open()
{
cout << "打开屏幕" << endl;
}
void close()
{
cout << "关闭屏幕" << endl;
}
};
#endif // SCREEN_H
projector.h:
#ifndef PROJECTOR_H
#define PROJECTOR_H
#include <iostream>
using namespace std;
class Projector {
public:
void on()
{
cout << "打开投影仪" << endl;
}
void off()
{
cout << "关闭投影仪" << endl;
}
void toDVD()
{
cout << "切换到DVD模式" << endl;
}
};
#endif // PROJECTOR_H
player.h:
#ifndef PLAYER_H
#define PLAYER_H
#include <iostream>
using namespace std;
class Player {
public:
void on()
{
cout << "开始播放" << endl;
}
void off()
{
cout << "停止播放" << endl;
}
};
#endif // PLAYER_H
main.cpp:
/*
* 外观模式
*
* date:2023-9-13
*/
#include <memory>
#include "theaterFacade.h"
int main()
{
cout << "观看DVD\n" << endl;
auto theaterFacade = make_shared<TheaterFacade>();
theaterFacade->watchDvd();
cout << "\n\n观看完毕\n" << endl;
theaterFacade->closeDvd();
}
运行截图: