外观模式:提供一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。
C#演示代码:
namespace 设计模式.外观模式
{
//高层接口类(家庭影院)
public class HomeTheaterFacede
{
//一群子系统
Amplifier amplifier;
Tuner tuner;
DvdPlayer dvdPlayer;
CdPlayer cdPlayer;
Projector projector;
TheaterLights theaterLights;
Screen screen;
PopcornPopper popcornPopper;
//在构造家庭影院是将子系统配置传入
public HomeTheaterFacede(Amplifier amplifier,
Tuner tuner,
DvdPlayer dvdPlayer,
CdPlayer cdPlayer,
Projector projector,
TheaterLights theaterLights,
Screen screen,
PopcornPopper popcornPopper)
{
this.amplifier = amplifier;
this.tuner = tuner;
this.dvdPlayer = dvdPlayer;
this.cdPlayer = cdPlayer;
this.projector = projector;
this.theaterLights = theaterLights;
this.screen = screen;
this.popcornPopper = popcornPopper;
}
//操作子系统们实现用户开始观看电影的一系列行为
public void watchMovie(string movie)
{
System.Windows.Forms.MessageBox.Show("即将有一部电影展现在您的面前...");
popcornPopper.on();
popcornPopper.pop();
theaterLights.on();
theaterLights.dim(10);
screen.down();
projector.on();
projector.wideSreenMode();
amplifier.on();
amplifier.setDvd(dvdPlayer);
amplifier.setSurroundSound();
amplifier.setVolume(5);
dvdPlayer.on();
dvdPlayer.play(movie);
}
//同样通子系统们实现完成观看后的一系列行为
public void endMovie()
{
System.Windows.Forms.MessageBox.Show("即将退出电影之旅...");
popcornPopper.off();
theaterLights.on();
screen.up();
projector.off();
amplifier.off();
dvdPlayer.stop();
dvdPlayer.eject();
dvdPlayer.off();
}
}
}
总结:
1.外观模式的意图是要提供一个简单的接口,让一群子系统更易于使用。外观模式是为符合最少知识原则而设计的。
2.“最少知识原则”:减少对象之间的交互,只留下几个“密友”。
3.不要让太多的类耦合在一起,免得修改系统中的一部分,会影响到其他部分。如果许多类之间互相依赖,那么这个系统就会变成一个一岁的系统,它需要花许多成本维护,也因为太复杂而不容易被其他人了解。
缺点:
采用这个原则会导致更多的“包装”类被制造出来,以处理和其他组件的沟通,这可能会导致复杂度和开发时间的增加,并降低运行时的性能。