外观模式主要目的是简化接口。
现在假设我们要组装一个家庭影院系统,系统内含有DVD播放器,投影机、自动屏幕、环绕立体声等。
下面就是类图
现在你想看电影,你得先执行下面操作:
1,将灯光调暗,2.打开投影器 3.将投影机的输入切换到DVD,4.将功能输入设置为DVD。。。。。等等很多步骤,写成方法就是下面这样
popper.on();
popper.pop();
lights.dim();
screen,down();
projector.on();
amp.on();
看完电影后,你又得反着运行上面代码一遍进行关闭动作。
下面就通过外观来改造一下了。
public class HomeTheaterFacade{
Amplifier amp;
Tuner tuner;
DvdPlayer dvd;
CdPlayer cd;
Projector projector;
public HomeTheaterFacade( Amplifier amp,Tuner tuner,DvdPlayer dvd,CdPlayer cd,Projector projector){
this.amp = amp;
this.tuner = tuner;
this.dvd = dvd;
this.cd =cd;
this.projector = projector;
}
//这是看电影方法
public void watchMovie(String movie){
popper.on();
popper.pop();
lights.dim();
screen,down();
projector.on();
amp.on();
}
public void endMovie(){
System.out.println("shutting movie theater down...");
popper.off();
lights.on();
screen.up();
//....等等
}
}
//现在看电影就很轻松了,只要调用HomeTheaterFacade的方法即可。
外观模式定义:提供了一个统一的接口,用来访问子系统中的一群接口,外观定义了一个高层接口,让子系统更容易使用。
ps:设计原则 最少知识原则,只和你的密友谈话。
最少知识原则具体说来就是在对象的方法内,我们应该调用属于以下范围的方法:
1.改对象本身
2.被当做方法参数而传递进来的对象
3.此方法所创建或者实例化的任何对象
4.对象的任何组件。
//比如这是不采用这个原则的方法,这样做的缺点是 :这个方法相当于向另一个对象的子部分发请求(而增加我们直接认识的对象数目)
public float getTemp(){
Thermometer thermometer = station.getThermomenter();
return thermomenter.getThemperature();
}
//这是采用这个原则的方法。采用这个原则也有缺点:虽然减少了对象之间的依赖,降低软件维护成本,但也会导致产生更多“包装类”,以处理与其它组件的沟通,导致复杂度与开发时间,降低运行时性能。
public float getTemp(){
return station.getThemperature();
}
总结就是各个设计模式目的: 装饰者--不改变接口,但加入责任
适配器--将一个接口转成另一个接口
外观--让接口更简单