- 一文带你搞懂Java动态代理
- 几分钟带你搞懂策略模式
- 几分钟带你搞懂观察者模式
- 一文彻底搞明白工厂和抽象工厂
- 一文搞明白装饰者模式
- 最全单例模式
- 几段代码搞明白命令模式
- 几段代码搞明白适配器模式
- 一看就懂的外观模式
关于外观模式的定义,我就直接引用Head First了:外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高级接口,让子系统更容易使用。听起来很抽象,其实外观模式的本质就是使用组合的方式,来管理一个子系统内的一群对象,它的意图即提供一个接口,好让一个子系统更易于使用。
外观模式
假如厂商提供了一组智能设备,并对外公开了如下接口,方便用户远程控制:
这是智能灯类。
public class Light {
public void on() {
System.out.println("开灯");
}
public void off() {
System.out.println("关灯");
}
}
这是智能空调类。
public class AirConditioner {
public void on() {
System.out.println("打开空调");
}
public void adjustTemperature() {
System.out.println("调节温度");
}
public void off() {
System.out.println("关闭空调");
}
}
这是智能热水器类。
public class Heater {
public void on() {
System.out.println("打开热水器蓄水加热");
}
public void adjustTemperature() {
System.out.println("调节温度");
}
public void off() {
System.out.println("关闭热水器");
}
}
正常情况下,用户类回到家中,可能都需要进行如下操作,见下:
public class ClientTest {
private static Light mLight;
private static AirConditioner mAc;
private static Heater mHeater;
public ClientTest(Light light, AirConditioner ac
, Heater heater) {
this.mLight = light;
this.mAc = ac;
this.mHeater = heater;
}
public static void main(String[] ags) {
/**
* 对用户来说,需要进行一系列操作,是不是特别繁琐。
* <ul>
* <li>打开灯光
* <li>打开空调
* <li>调节室内温度
* <li>打开热水器准备热水
* <li>调节水温
* </ul>
*/
mLight.on();
mAc.on();
mAc.adjustTemperature();
mHeater.on();
mHeater.adjustTemperature();
}
}
这对于用户来说就显得非常繁琐不友好了。外观模式正是在这种情况下应运而生的。外观对用户提供简化的接口,将用户类与具体的智能设备类解耦。我们来创建一个外观类:
public class HardwareFacade {
private Light mLight;
private AirConditioner mAc;
private Heater mHeater;
public HardwareFacade(Light light, AirConditioner ac
, Heater heater) {
this.mLight = light;
this.mAc = ac;
this.mHeater = heater;
}
/**
* 为智能硬件这个子系统提供一个简单接口。
*
* <p>用户到家只需要调用这一个请求,
* 就可以享受有灯、有水、凉飕飕。
*/
public void openAppliance() {
mLight.on();
mAc.on();
mAc.adjustTemperature();
mHeater.on();
mHeater.adjustTemperature();
}
}
用户只需与我们的外观类HardwareFacade进行交互即可,这大大简化了用户的操作。外观类通过组合的方式实现了对智能硬件这个子系统的管理,让智能硬件与用户实现了解耦。当然这并不影响用户单独对于具体智能硬件类的使用,即外观提供简单接口的同时,依然将系统完整的功能暴露出来,以供用户需要时使用。再来看下用户类的调用代码:
public class ClientTest {
public static void main(String[] ags) {
HardwareFacade facade = new HardwareFacade(light, ac, heater);
facade.openAppliance();
}
}