门面模式(Facade Pattern)是一种结构型设计模式,它提供了一个统一的接口,用来访问子系统中的一群接口。门面模式定义了一个高层接口,让子系统更容易使用。
门面模式特点
- 简化接口:门面模式提供了一个简单的接口来与复杂的子系统进行交互,使得子系统的使用更加简单。
- 解耦系统:通过引入门面,客户端代码可以与子系统解耦。客户端不需要了解子系统的复杂性,只需与门面进行交互。
- 提升可维护性:当子系统发生变化时,只需要修改门面类即可,不需要改动客户端代码。
适用场景
- 子系统包含了多个复杂的接口和功能模块时,通过门面模式来提供一个简单的接口。
- 需要为一个复杂子系统提供一个简单的接口,提高系统的易用性。
- 减少客户端与多个子系统之间的耦合,使得子系统的变化不会影响到客户端。
C++案例
假设我们要设计一个家庭影院系统,它包含多个子系统:DVD播放器、投影仪、音响系统、灯光系统。我们可以使用门面模式为客户端提供一个简单的接口来控制整个家庭影院。
#include <iostream>
// DVD播放器子系统
class DVDPlayer {
public:
void on() { std::cout << "DVD Player on\n"; }
void off() { std::cout << "DVD Player off\n"; }
void play() { std::cout << "DVD Player playing\n"; }
};
// 投影仪子系统
class Projector {
public:
void on() { std::cout << "Projector on\n"; }
void off() { std::cout << "Projector off\n"; }
void wideScreenMode() { std::cout << "Projector in widescreen mode\n"; }
};
// 音响系统子系统
class SoundSystem {
public:
void on() { std::cout << "Sound System on\n"; }
void off() { std::cout << "Sound System off\n"; }
void setVolume(int volume) { std::cout << "Sound System volume set to " << volume << '\n'; }
};
// 灯光系统子系统
class Lights {
public:
void dim(int level) { std::cout << "Lights dimmed to " << level << "%\n"; }
};
// 门面类
class HomeTheaterFacade {
private:
DVDPlayer dvd;
Projector projector;
SoundSystem sound;
Lights lights;
public:
void watchMovie() {
std::cout << "Get ready to watch a movie...\n";
lights.dim(10);
projector.on();
projector.wideScreenMode();
sound.on();
sound.setVolume(5);
dvd.on();
dvd.play();
}
void endMovie() {
std::cout << "Shutting movie theater down...\n";
dvd.off();
sound.off();
projector.off();
lights.dim(100);
}
};
int main() {
HomeTheaterFacade homeTheater;
homeTheater.watchMovie();
homeTheater.endMovie();
return 0;
}
案例说明
1、 DVDPlayer:表示DVD播放器子系统,包含开关和播放功能;
2、 Projector:表示投影仪子系统,包含开关和宽屏模式设置功能;
3、 SoundSystem:表示音响系统子系统,包含开关和音量设置功能;
4、 Lights:表示灯光系统子系统,包含调光功能;
5、 HomeTheaterFacade:门面类,包含所有子系统的实例,提供watchMovie和endMovie两个方法,简化了客户端对家庭影院系统的操作;
门面模式总结
门面模式通过提供一个简化的接口,使得客户端可以轻松地与复杂的子系统进行交互。这不仅简化了客户端的代码,也提高了系统的可维护性和扩展性。门面模式尤其适用于需要对一组复杂的子系统提供简单接口的场景,以及希望解耦客户端和子系统的情况。
END
今天是日更的第15/100天
封面照片:Sheena
版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: