1.迪米特法则:知道很少的事情就把问题解决了,两个类之间不必通信,也就是说,两个类之间不用相互的作用
优点:
1客户不要了解子系统内部实现,只需要通过外观类进行交互降低了耦合性
2.简单易用,提供一个简单的接口,客户端能使用复杂的子系统。
缺点:
1.增加新的子系统时,要修改外观类的代码,违反了开闭原则
2虽然隐藏了复杂性,但也可能隐藏了一些重要的细节信息,客户端可能无法直接访问到这些信息,
适用场景:
在一个系统需要多个系统系统协同完成某项功能时,可以提供一个外观类接口。
1.汽车的控制系统:汽车中包含多个复杂的子系统,发动机,导航系统,空调系统,车载娱乐,通过外观模式,
可以为这些子系统提供一个统一的接口,驾驶员可以通过简单的命令来控制复杂的功能。
2.电气系统:汽车的电系统包括了很多组件,例如灯光,仪表盘。锁车
3.媒体播放器:在开发一个视频或音频播放器时,视频音频的解码,字幕处理,播放控制都是复杂的子系统
使用外观模式可以简化播放器接口,用户只需要关注播放暂停基本操作。
4.网络切换:信号处理,资源管理,网络配置....这些实现非常复杂,可以通过外观模式来简化用户对这些(4g,5g)转换
操作的调用
5.游戏的默认:背景音乐,分辨率,图形质量,鼠标的灵敏度,窗口的大小.......
一键启动:
#include<iostream>
using namespace std;//电视类
class Televison
{
public:void on(){cout<<"电视打开"<<endl;}void off(){cout<<"电视关闭"<<endl;}
};//灯光类
class Light
{
public:void on(){cout<<"灯打开"<<endl;}void off(){cout<<"灯关闭"<<endl;}
};
//麦克风类
class Mcrophone
{
public:void on(){cout<<"麦克风打开"<<endl;}void off(){cout<<"麦克风关闭"<<endl;}
};
//音响类
class Aduio
{
public:void on(){cout<<"音响打开"<<endl;}void off(){cout<<"音响关闭"<<endl;}
};//DVD类
class DVD
{
public:void on(){cout<<"DVD打开"<<endl;}void off(){cout<<"DVD关闭"<<endl;}
};//外观类
class KTV_mode
{Televison* tel;Light *lig;Mcrophone *mcr;Aduio *adu;DVD *dvd;
public:KTV_mode(){tel=new Televison;lig=new Light ;mcr=new Mcrophone;adu=new Aduio ;dvd=new DVD ;}~KTV_mode(){delete tel;delete lig;delete mcr;delete adu;delete dvd;}void test_on(){tel->on();lig->off();mcr->on();adu->on();dvd ->on();}void test_off(){tel->off();lig->on();mcr->off();adu->off();dvd ->off();}};
int main()
{KTV_mode *ktv=new KTV_mode;//ktv->test_on();ktv->test_off();}
