设计模式(八)一看就懂的外观模式

  • 一文带你搞懂Java动态代理
  • 几分钟带你搞懂策略模式
  • 几分钟带你搞懂观察者模式
  • 一文彻底搞明白工厂和抽象工厂
  • 一文搞明白装饰者模式
  • 最全单例模式
  • 几段代码搞明白命令模式
  • 几段代码搞明白适配器模式
  • 一看就懂的外观模式

关于外观模式的定义,我就直接引用Head First了:外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高级接口,让子系统更容易使用。听起来很抽象,其实外观模式的本质就是使用组合的方式,来管理一个子系统内的一群对象,它的意图即提供一个接口,好让一个子系统更易于使用。

外观模式

假如厂商提供了一组智能设备,并对外公开了如下接口,方便用户远程控制:
设计模式(八)一看就懂的外观模式_第1张图片
这是智能灯类

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) {
        /**
         * 对用户来说,需要进行一系列操作,是不是特别繁琐。
         * 
    *
  • 打开灯光 *
  • 打开空调 *
  • 调节室内温度 *
  • 打开热水器准备热水 *
  • 调节水温 *
*/
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;
    }

    /**
     * 为智能硬件这个子系统提供一个简单接口。
     * 
     * 

用户到家只需要调用这一个请求, * 就可以享受有灯、有水、凉飕飕。 */ 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();
     }
}

你可能感兴趣的:(模式架构)