html5 个人网站模板,wordpress的title,广州培训网站建设,网站建设 报价定义
外观模式#xff08;Facade Pattern#xff09; 是一种结构型设计模式#xff0c;它通过为复杂的子系统提供一个统一的接口#xff0c;使得子系统的使用更加简化。外观模式通常隐藏了复杂的内部子系统#xff0c;使得客户端可以通过一个简单的接口与这些子系统进行交…定义
外观模式Facade Pattern 是一种结构型设计模式它通过为复杂的子系统提供一个统一的接口使得子系统的使用更加简化。外观模式通常隐藏了复杂的内部子系统使得客户端可以通过一个简单的接口与这些子系统进行交互。
核心思想
简化接口通过提供一个简单的接口来封装复杂的子系统。 解耦客户端不需要了解子系统的内部实现只需与外观类交互降低了系统的复杂性。
适用场景
外观模式适用于以下场景
简化复杂系统当系统中有多个复杂的子系统时使用外观模式提供一个简单的接口以减少客户端与子系统的交互复杂度。解耦客户端与子系统客户端无需知道子系统内部的工作原理只需与外观类交互即可。多层次接口当系统提供了多个接口并且这些接口之间有复杂的交互时使用外观模式可以通过统一接口简化调用。
常见应用场景
音响系统控制将复杂的音响系统如播放、调整音量、切换输入源等通过外观模式提供一个简单的接口进行控制。家庭自动化系统例如控制家庭的智能设备照明、安防、温控等可以通过一个统一的控制接口进行操作。
类设计
外观模式的设计通常包括以下角色
1.Facade外观类为客户端提供简化的接口它与子系统进行交互。 2.Subsystem子系统复杂的子系统提供实际的功能实现。 3.Client客户端通过外观类与子系统交互。
代码实现解析 假设我们有一个家庭影院系统系统包括音响、投影仪、DVD 播放器和灯光等多个组件。我们希望通过外观模式来简化控制这些组件的操作。
子系统类设计
#include iostream
#include string
using namespace std;class Amplifier {
public:void on() {cout Amplifier on endl;}void off() {cout Amplifier off endl;}void setVolume(int level) {cout Setting volume to level endl;}
};class Projector {
public:void on() {cout Projector on endl;}void off() {cout Projector off endl;}void wideScreenMode() {cout Projector in widescreen mode endl;}
};class DVDPlayer {
public:void on() {cout DVD Player on endl;}void off() {cout DVD Player off endl;}void play(string movie) {cout Playing movie: movie endl;}void stop() {cout Stopping movie endl;}
};class Lights {
public:void dim(int level) {cout Dimming lights to level % endl;}void on() {cout Lights on endl;}
};
外观类设计:
class HomeTheaterFacade {
private:Amplifier* amplifier;Projector* projector;DVDPlayer* dvdPlayer;Lights* lights;public:HomeTheaterFacade(Amplifier* amp, Projector* proj, DVDPlayer* dvd, Lights* light) :amplifier(amp), projector(proj), dvdPlayer(dvd), lights(light) {}void watchMovie(string movie) {cout Get ready to watch a movie... endl;lights-dim(10);projector-on();projector-wideScreenMode();amplifier-on();amplifier-setVolume(5);dvdPlayer-on();dvdPlayer-play(movie);}void endMovie() {cout Shutting down the movie theater... endl;lights-on();projector-off();amplifier-off();dvdPlayer-stop();dvdPlayer-off();}
};
客户端调用:
int main() {Amplifier* amplifier new Amplifier();Projector* projector new Projector();DVDPlayer* dvdPlayer new DVDPlayer();Lights* lights new Lights();// 创建外观对象简化子系统接口HomeTheaterFacade* homeTheater new HomeTheaterFacade(amplifier, projector, dvdPlayer, lights);// 客户端通过外观类调用子系统的功能homeTheater-watchMovie(Inception);homeTheater-endMovie();delete amplifier;delete projector;delete dvdPlayer;delete lights;delete homeTheater;return 0;
}
输出如下:
Get ready to watch a movie...
Dimming lights to 10%
Projector on
Projector in widescreen mode
Amplifier on
Setting volume to 5
DVD Player on
Playing movie: Inception
Shutting down the movie theater...
Lights on
Projector off
Amplifier off
Stopping movie
DVD Player off
可以看到客户端通过 HomeTheaterFacade 只调用了 watchMovie 和 endMovie 两个方法就完成了多个子系统的操作。HomeTheaterFacade 为客户端提供了一个简单的接口屏蔽了子系统的复杂性。
类设计分析
1.子系统类这些类Amplifier、Projector、DVDPlayer、Lights是独立的子系统负责实现实际的功能。
每个子系统类都有复杂的内部实现客户端不需要直接与这些类交互。
2.外观类HomeTheaterFacade
HomeTheaterFacade 类封装了所有子系统的操作它通过提供简化的 watchMovie 和 endMovie 方法来控制整个家庭影院系统。外观类与所有子系统类交互客户端只需要调用外观类的方法而无需关心如何具体操作每个子系统。
3.客户端客户端代码通过 HomeTheaterFacade 与所有子系统进行交互而无需了解子系统的具体实现。
总结
Facade 模式的优点
简化接口将复杂子系统的接口进行封装提供统一的简单接口。解耦客户端不再与子系统的多个组件交互只与外观类交互减少了系统之间的耦合。提高可维护性外观模式通过将子系统的复杂性隐藏在外观类中使得系统的维护更加容易
Facade 模式的缺点
增加了外观类的复杂性随着子系统的增多外观类可能变得较为庞大维护时需要确保其接口不会被滥用。可能导致过度设计如果系统本身比较简单使用外观模式可能是过度设计增加了不必要的复杂度。
Facade 模式的适用场景
简化复杂的子系统接口当系统有多个复杂的子系统时可以使用外观模式来提供统一的简单接口。降低子系统间的耦合当不同子系统之间的依赖性较强时外观模式能有效隔离这些子系统减少系统间的相互依赖。提供一个高层接口当多个子系统的调用顺序复杂时外观模式能提供一个简化的接口。
总结:
外观模式通过为复杂的系统提供一个简单的接口简化了系统的使用和管理。客户端无需了解系统内部的复杂实现只需要与外观类交互外观类负责协调多个子系统的操作。外观模式通常用于简化客户端与子系统之间的交互并提高系统的可维护性。