【C++】【设计模式】外观模式(Facade Pattern)
定义
-
结构型模式
-
外观模式(Facade Pattern):
提供了一个简化的接口,用来访问复杂子系统中的一组接口。它隐藏了系统的复杂性,使客户端与子系统的交互更加简单和易用。 -
外观类
-
子系统类
UML 类图
Demo
#include <iostream>
#include <string>
// 播放器基类
class Player {
public:
virtual void on() = 0;
virtual void off() = 0;
virtual void play(std::string) = 0;
virtual void stop() = 0;
virtual ~Player() {}
};
// DVD 播放器
class DvdPlayer : public Player {
public:
void on() override {
std::cout << "DvdPlayer is on." << std::endl;
}
void off() override {
std::cout << "DvdPlayer is off." << std::endl;
}
void play(std::string movie) override {
std::cout << "Playing " << movie << " on DvdPlayer." << std::endl;
}
void stop() override {
std::cout << "DvdPlayer is stopped." << std::endl;
}
};
// 投影仪
class Projector {
public:
void on() {
std::cout << "Projector is on." << std::endl;
}
void off() {
std::cout << "Projector is off." << std::endl;
}
};
// 灯光
class Light {
public:
void on() {
std::cout << "Light is on." << std::endl;
}
void off() {
std::cout << "Light is off." << std::endl;
}
};
// 家庭影院外观类
class HomeTheaterFacade {
private:
DvdPlayer dvdPlayer_;
Projector projector_;
Light light_;
public:
HomeTheaterFacade(DvdPlayer dvdPlayer, Projector projector, Light light) :
dvdPlayer_(dvdPlayer), projector_(projector), light_(light) {}
void watchMovie(std::string movie) {
std::cout << "Get ready to watch a movie..." << std::endl;
light_.off();
projector_.on();
dvdPlayer_.on();
dvdPlayer_.play(movie);
}
void endMovie() {
std::cout << "Shutting movie theater down..." << std::endl;
light_.on();
projector_.off();
dvdPlayer_.stop();
dvdPlayer_.off();
}
};
int main() {
DvdPlayer dvdPlayer;
Projector projector;
Light light;
HomeTheaterFacade homeTheater(dvdPlayer, projector, light);
homeTheater.watchMovie("The Matrix");
homeTheater.endMovie();
return 0;
}
分析与总结
- 简化客户端的操作:通过外观模式,客户端可以用一个简洁的接口来与子系统进行交互,而不必了解子系统的细节。
- 减低客户端与子系统的耦合:客户端只依赖外观类,而外观类负责与子系统的具体实现打交道。
- 提高灵活性和可维护性:子系统内部的变化不会影响到客户端,客户端只需与外观类交互,代码的维护和扩展更加灵活