外观模式 (Facade Pattern)
意图:为子系统中的一组接口提供一个一致的界面,简化使用。
基础组件
- Facade (外观):提供简化的接口
- Subsystem Classes (子系统类):实现子系统的功能
继承/实现关系
Facade --> SubsystemClass1, SubsystemClass2, ... (组合关系)
应用场景
- 简化复杂系统的使用
- 为子系统提供清晰入口点
- 减少系统间的耦合
C++ 实现(家庭影院场景)
#include <iostream>
#include <string>
/*
* 外观模式
* 意图:为子系统中的一组接口提供一个一致的界面,简化使用。
* 基础组件:
* - Facade (外观):提供简化的接口
* - Subsystem Classes (子系统类):实现子系统的功能
* 继承/实现关系:
* Facade 依赖于多个子系统类,通过它们提供的功能来实现简化的接口。
*/
// 子系统:投影仪
class Projector {
public:
void on() { std::cout << "Projector on\n"; }
void off() { std::cout << "Projector off\n"; }
void setInput(const std::string& input) {
std::cout << "Projector input set to " << input << "\n";
}
};
// 子系统:音响系统
class SoundSystem {
public:
void on() { std::cout << "Sound system on\n"; }
void off() { std::cout << "Sound system off\n"; }
void setVolume(int level) {
std::cout << "Volume set to " << level << "\n";
}
};
// 子系统:蓝光播放器
class BluRayPlayer {
public:
void on() { std::cout << "Blu-ray player on\n"; }
void off() { std::cout << "Blu-ray player off\n"; }
void play(const std::string& movie) {
std::cout << "Playing movie: " << movie << "\n";
}
};
// 子系统:灯光控制器
class Lights {
public:
void dim(int level) {
std::cout << "Lights dimmed to " << level << "%\n";
}
void on() { std::cout << "Lights on\n"; }
};
// 外观:家庭影院外观
class HomeTheaterFacade {
public:
HomeTheaterFacade(Projector* proj, SoundSystem* sound,
BluRayPlayer* player, Lights* lights)
: projector_(proj), sound_(sound), player_(player), lights_(lights) {}
void watchMovie(const std::string& movie) {
std::cout << "Get ready to watch a movie...\n";
lights_->dim(10);
projector_->on();
projector_->setInput("HDMI");
sound_->on();
sound_->setVolume(20);
player_->on();
player_->play(movie);
}
void endMovie() {
std::cout << "Shutting down home theater...\n";
player_->off();
sound_->off();
projector_->off();
lights_->on();
}
private:
Projector* projector_;
SoundSystem* sound_;
BluRayPlayer* player_;
Lights* lights_;
};
void FacadePattern()
{
std::cout << std::string(13, '-') << " Facade Pattern " << std::string(13, '-') << std::endl;
Projector projector;
SoundSystem sound;
BluRayPlayer player;
Lights lights;
HomeTheaterFacade theater(&projector, &sound, &player, &lights);
theater.watchMovie("Inception");
// ... 观看电影 ...
theater.endMovie();
}
组件对应关系
HomeTheaterFacade→ 外观Projector/SoundSystem/BluRayPlayer/Lights→ 子系统类
2569

被折叠的 条评论
为什么被折叠?



