在观看电影前,需要进行一系列的操作,比如打开爆米花机、打开投影仪等等,观看完毕后还要把这些设备全部关闭,这样的操作十分繁琐,该怎么去简化?
public class HomeTheaterTest{
public static void main(String[] args){
poper.on();
projector.on();
dvd.on();
...
poper.off();
projector.off();
dvd.off();
}
}
- 提供一个统一的接口用来访问子系统中的一堆接口,其实就是提供一个高层接口
- 让客户和子系统之间避免紧耦合,保证了最少知识原则
尽量避免太多类耦合,为了保证该原则,在某个对象某个方法中,应该调用以下范围的方法:
- 该对象本身的方法
- 方法参数中的对象的方法
- 方法中创建的任何对象
- 对象的任何组件
// 正确示范
public class Car{
Engine engine; // ① engine为Car类的组件
public void start(Key key){ // ② key为参数中的对象
Doors doors = new Doors(); // ③ 方法中创建的对象
boolean authorized = key.turns(); // 调用②的方法
if(authorized){
engine.start(); // 调用①的方法
updateDashboard(); // 调用④
doors.lock(); // 调用③的方法
}
}
public void updateDashboard(){ // ④ 对象本身的方法
...
}
}
// 错误示范
public float getTemp(){
Thermometer thermometer = station.getThermometer(); // 多创建一个类,没有必要
return thermometer;
}
// 正确示范
public float getTemp(){
// station是当前类的组件
return station.getThermometer(); // 减少依赖类的数目
}
使用组合让外观能够访问子系统中所有的组件
public class HomeTheaterFacade{
PopcornPopper popper;
Projector projector;
DVDPlayer dvd;
public HomeTheaterFacade(PopcornPopper popper, Projector projector,DVDPlayer dvd){
this.popper = popper;
this.projector = projector;
this.dvd = dvd;
}
// 具体代码在“实现简化的接口”
public void watchMovie(String movie){...}
public void endMovie(){...}
}
将子系统的组件整合为统一的接口用于访问
public void watchMovie(String movie){
popper.on();
projector.on();
dvd.on();
dvd.play(movie);
}
public void endMovie(){
popper.off();
projector.off();
dvd.off();
}
public class HomeTheaterTest{
public static void main(String[] args){
// 实例化组件,这里省略
HomeTheaterFacade homeTheater = new HomeTheaterFacade(popper, projector, dvd);
homeTheater.watchMovie("xxx");
homeTheater.endMovie();
}
}
- 装饰者模式不改变接口,但是加入责任(将一个对象包装起来以增加新的行为和责任)
- 适配器模式将一个接口转换为另一个接口(将一个对象包装起来以改变其接口)
- 外观模式让接口更加简单(将一群对象包装起来简化其接口)