一.优点
1.端屏蔽了⼦系统组件,减少了客户所需处理的对象数⽬,并
使得⼦系统使⽤起来更加容易。
2.它实现了⼦系统与客户端之间的松耦合关系,这使得⼦系统的变化不会
影响到调⽤它的客户端,只需要调整外观类即可。
3.⼀个⼦系统的修改对其他⼦系统没有任何影响。
二.缺点
1.设计不当,增加新的⼦系统可能需要修改外观类的源代码,违背了
开闭原则。
三.应用场景
1.复杂系统需要简单⼊⼝使⽤。
2.客户端程序与多个⼦系统之间存在很⼤的依赖性。
3.在层次化结构中,可以使⽤外观模式定义系统中每⼀层的⼊⼝,层与
层之间不直接产⽣联系,⽽通过外观类建⽴联系,降低层之间的耦合度。
ps:这不就是把功能类组合起来吗
//appearance.hpp
#pragma once
#include <iostream>
class DVDPlay
{
public:
void On()
{
std::cout << "打开了DVD" << std::endl;
}
void Off()
{
std::cout << "关闭了DVD" << std::endl;
}
};
class VoiceBox
{
public:
void On()
{
std::cout << "打开了音箱" << std::endl;
}
void Off()
{
std::cout << "关闭了音响" << std::endl;
}
};
class XBox
{
public:
void On()
{
std::cout << "打开了xbox游戏机" << std::endl;
}
void Off()
{
std::cout << "关闭了xbox游戏机" << std::endl;
}
};
class TV
{
public:
void On()
{
std::cout << "打开TV" << std::endl;
}
void Off()
{
std::cout << "关闭TV" << std::endl;
}
};
class Microphone
{
public:
void On()
{
std::cout << "麦克风打开了" << std::endl;
}
void Off()
{
std::cout << "麦克风关闭了" << std::endl;
}
};
class Light
{
public:
void On()
{
std::cout << "打开灯" << std::endl;
}
void Off()
{
std::cout << "关闭灯" << std::endl;
}
};
//外观类
class HomePlayFacade
{
public:
//看电影
void SeeMovic()
{
std::cout << "进入看电影模式" << std::endl;
light.Off();
tv.On();
vioce_box.On();
}
void DoKtv()
{
std::cout << "智慧家庭进入KTV模式" << std::endl;
tv.On();
vioce_box.On();
dvd.On();
micro_phone.On();
}
//打游戏
void PlayGame()
{
std::cout << "智慧家庭进⼊ 游戏模式" << std::endl;
tv.On();
vioce_box.On();
xbox.On();
}
//休息
void Rest()
{
std::cout << "智慧家庭 休息模式" << std::endl;
light.Off();
tv.Off();
vioce_box.Off();
dvd.Off();
micro_phone.Off();
xbox.Off();
}
private:
Light light;
Microphone micro_phone;
TV tv;
XBox xbox;
VoiceBox vioce_box;
DVDPlay dvd;
};
//main.cpp
#include "appearance.h"
#include <iostream>
int main()
{
HomePlayFacade facade;
facade.DoKtv();
facade.PlayGame();
facade.SeeMovic();
facade.Rest();
return 0;
}