设计模式(C)-结构型模式-外观模式一、外观模式概述外观模式是一种结构型设计模式它为复杂系统提供一个统一的简化接口隐藏内部复杂性让客户端更容易使用系统。核心思想简化接口封装复杂性。外观模式为一组复杂接口提供统一的高层接口降低使用门槛。二、外观模式UML类图2.1 场景:家庭影院系统一个复杂的家庭影院系统包含多个子系统DVD播放器、投影仪、音响、灯光、空调等。外观模式将这些复杂的操作简化为几个简单的方法。三、代码实现//facade.h/* *外观模式(Facade Pattern)是一种结构型设计模式它为复杂系统提供一个统一的简化接口 隐藏内部复杂性让客户端更容易使用系统。 核心思想简化接口封装复杂性。外观模式为一组复杂接口提供统一的高层接口降低使用门槛。 场景家庭影院系统 一个复杂的家庭影院系统包含多个子系统DVD播放器、投影仪、音响、灯光、空调等。 外观模式将这些复杂的操作简化为几个简单的方法。 */#pragmaonce#includeiostream#includestring#includememoryusingnamespacestd;//子系统类//1.DVD播放器子系统classDVDPlayer{public:voidon();voidoff();voidplay(conststringmovie);voidpuase();voidstop();voidsetSurroundSound();};//2.投影仪子系统classProjector{public:voidon();voidoff();voidsetWideScreenMode();voidsetInput(conststringsource);};//3.音响子系统classAudioSystem{public:voidon();voidoff();voidsetVolume(intlevel);voidsetSurroundMode();voidsetInput(conststringsource);};//4.灯光子系统classLightingSystem{public:voiddim(intlevel);voidon();voidoff();};//5.空调子系统classAirConditioner{public:voidon();voidoff();voidsetTemperature(intdegree);voidsetMode(conststd::stringmode);};//6.家庭影院外观类classHomeTheaterFacade{private:unique_ptrDVDPlayerdvd;unique_ptrProjectorprojector;unique_ptrAudioSystemaudio;unique_ptrLightingSystemlights;unique_ptrAirConditionerac;public://构造函数创建所有子系统对象HomeTheaterFacade():dvd(make_uniqueDVDPlayer()),projector(make_uniqueProjector()),audio(make_uniqueAudioSystem()),lights(make_uniqueLightingSystem()),ac(make_uniqueAirConditioner()){}//也可以传入已经存在的子系统对象HomeTheaterFacade(unique_ptrDVDPlayerdvd,unique_ptrProjectorprojector,unique_ptrAudioSystemaudio,unique_ptrLightingSystemlights,unique_ptrAirConditionerac):dvd(std::move(dvd)),projector(std::move(projector)),audio(std::move(audio)),lights(std::move(lights)),ac(std::move(ac)){}//简化接口voidwatchMovie(conststringmovie);voidendMovie();voidlistenToMusic(conststringsource);voidshutdownAll();voidadjustLighting(intlevel);voidadjustVolume(intlevel);voidadjustTemperature(intdegree);};voidtestFacade();//facede.cc#includefacade.h//DVD播放器子系统voidDVDPlayer::on(){coutDVD播放器: 开启\n;}voidDVDPlayer::off(){coutDVD播放器: 关闭\n;}voidDVDPlayer::play(conststringmovie){coutDVD播放器: 播放电影《movie》\n;}voidDVDPlayer::puase(){coutDVD播放器: 暂停\n;}voidDVDPlayer::stop(){coutDVD播放器: 停止\n;}voidDVDPlayer::setSurroundSound(){coutDVD播放器: 启用环绕声\n;}//投影仪子系统voidProjector::on(){cout投影仪: 开启\n;}voidProjector::off(){cout投影仪: 关闭\n;}voidProjector::setWideScreenMode(){cout投影仪: 宽屏模式\n;}voidProjector::setInput(conststringsource){cout投影仪: 输入源设置为 source\n;}//音响子系统voidAudioSystem::on(){cout音响系统: 开启\n;}voidAudioSystem::off(){cout音响系统: 关闭\n;}voidAudioSystem::setVolume(intlevel){cout音响系统: 音量设置为 level\n;}voidAudioSystem::setSurroundMode(){cout音响系统: 环绕声模式\n;}voidAudioSystem::setInput(conststringsource){cout音响系统: 输入源设置为 source\n;}//灯光子系统voidLightingSystem::dim(intlevel){cout灯光系统: 调暗到 level%\n;}voidLightingSystem::on(){cout灯光系统: 开启\n;}voidLightingSystem::off(){cout灯光系统: 关闭\n;}//空调子系统voidAirConditioner::on(){cout空调: 开启\n;}voidAirConditioner::off(){cout空调: 关闭\n;}voidAirConditioner::setTemperature(intdegree){cout空调: 温度设置为 degree°C\n;}voidAirConditioner::setMode(conststd::stringmode){cout空调: 模式设置为 mode\n;}// 家庭影院外观类 voidHomeTheaterFacade::watchMovie(conststringmovie){cout\n 准备观看电影: movie\n;cout\n;//按照正确顺序启动所有设备lights-dim(10);//调暗灯光projector-on();//打开投影仪projector-setInput(DVD);projector-setWideScreenMode();audio-on();// 打开音响audio-setInput(DVD);audio-setSurroundMode();audio-setVolume(20);dvd-on();// 打开DVDdvd-setSurroundSound();dvd-play(movie);ac-on();// 打开空调ac-setTemperature(24);ac-setMode(舒适);cout✅ 家庭影院准备就绪开始观影\n;}voidHomeTheaterFacade::endMovie(){cout\n⏹️ 结束观影\n;cout\n;dvd-stop();dvd-off();audio-setVolume(0);audio-off();projector-off();lights-on();// 恢复灯光lights-dim(80);cout✅ 设备已关闭\n;}voidHomeTheaterFacade::listenToMusic(conststringsource){cout\n 听音乐模式\n;cout\n;lights-dim(30);audio-on();audio-setInput(source);audio-setVolume(15);ac-on();ac-setTemperature(25);cout✅ 音乐模式准备就绪\n;}voidHomeTheaterFacade::shutdownAll(){cout\n 关闭所有设备\n;cout\n;dvd-off();projector-off();audio-off();lights-off();ac-off();cout✅ 所有设备已关闭\n;}voidHomeTheaterFacade::adjustLighting(intlevel){lights-dim(level);}voidHomeTheaterFacade::adjustVolume(intlevel){audio-setVolume(level);}voidHomeTheaterFacade::adjustTemperature(intdegree){ac-setTemperature(degree);}voidtestFacade(){coutFacade startendl;cout 家庭影院系统演示\n;cout\n;// 方式1外观类负责创建所有子系统HomeTheaterFacade theater;// 使用简化接口theater.watchMovie(阿凡达);theater.adjustVolume(25);// 可以单独调整theater.endMovie();// 使用其他模式theater.listenToMusic(蓝牙);theater.shutdownAll();std::cout\n\n;// 方式2依赖注入方式cout 依赖注入方式演示\n;cout\n;autocustomDVDstd::make_uniqueDVDPlayer();autocustomProjstd::make_uniqueProjector();autocustomAudiostd::make_uniqueAudioSystem();autocustomLightsstd::make_uniqueLightingSystem();autocustomACstd::make_uniqueAirConditioner();HomeTheaterFacadecustomTheater(std::move(customDVD),std::move(customProj),std::move(customAudio),std::move(customLights),std::move(customAC));customTheater.watchMovie(星际穿越);customTheater.endMovie();coutFacade Endendl;}四、优缺点总结优点:简化使用客户端只需要调用少数方法降低耦合客户端与子系统解耦提高可维护性子系统变化不影响客户端层次化结构可以定义多层外观缺点可能转换为上帝对象外观类承担过多责任新增依赖客户端依赖外观而非直接子系统可能隐藏功能过度简化可能丢失高级功能