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

关于外观模式的定义,我就直接引用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();
     }
}

猜你喜欢

转载自blog.csdn.net/MingJieZuo/article/details/106459163
今日推荐