外观模式将一个或数个类的复杂的一切都隐藏在背后,只显露出一个干净美好的外观。
构建自己的家庭影院
//打开爆米花机,开始爆米花
popper.on();
popper.pop();
//调整灯光亮度
lights.dim(10);
//把屏幕放下
screen.down();
//打开投影仪
projector.on();
projector.setInput(dvd);
projector.wideScreenMode();
//打开对应功效
amp.on();
amp.setDvd(dvd);
amp.setSurroundSound();
amp.setVolume(5);
//打开DVD播放机
dvd.on();
dvd.play(movie);
以上是看电影的任务,写成对应的类和方法的调用,如何解决这混乱的现象?可以使用外观模式。
通过实现一个提供更合理的接口的外观类,你可以将一个复杂的子系统变得容易使用。如果你需要复杂子系统的强大威力,还是可以使用原来的复杂接口;如果需要的是一个方便使用的接口,那就使用外观。
定义外观模式
创建一个接口简化而统一的类,用来包装子系统中一个或多个复杂的类。外观模式允许我们让客户和子系统之间避免紧耦合。
外观模式 提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。
"最少知识"原则
最少知识原则:只和你的密友谈话。
这个原则希望我们在设计中,不要让太多的类耦合在一起,免得修改系统中一部分,会影响到其他部分。如果许多类之间相互依赖,那么这个系统就会变成一个易碎的系统,它需要花许多成本维护,也会因为太复杂而不容易被其他人了解。
不要影响太多对象
就任何对象而言,在该对象的方法内,我们之应该调用属于以下范围的方法:
- 该对象本身。
- 被当作方法的参数而传递进来的对象。
- 次方法所创建或实例化的任何对象。
- 对象的任何组件。
对以上的总结:如果某对象是调用其他方法的返回结果,不要调用该对象的方法。
//从气象站取得温度计,然后再从温度计对象获取温度(不推荐)
public float getTemp(){
Thermometer thermometer = station.getThermometer();
return thermometer.getTemperature();
}
//应用最少知识原则,在气象站加入一个方法,用来向温度计请求温度。这样可以减少我们所依赖的类的数目
public float getTemp(){
return station.getTemperature();
}
将方法调用保持在界限内
以下汽车类,展示调用方法的各种做饭,同时遵守最少知识原则
/**
* @ClassName Car
* @Author jia_xx
* @Date 2023/1/14 21:25
*/
public class Car {
//实例变量
//类的组件,可以调用它的方法
Engine engine;
public Car(){
//初始化发动机
}
public void start(Key key){
Doors doors = new Doors();
//参数传递进来的对象,其方法可以调用
boolean authorized = key.turns();
if(authorized){
//组件方法,可以调用
engine.start();
//同一个对象的本地方法,可以调用(local method)
updateDashboardDisplay();
//可以调用创建或实例化的对象方法
doors.lock();
}
}
public void updateDashboardDisplay(){
//更新展示
}
}