Day09-设计模式之外观模式

设计模式之外观模式

一、引例

当我们现在想要在家通过投影仪看电影,其过程包括关灯,关闭窗帘,打开投影仪,这些家居都是独立的,就会有灯光开关、窗帘开关、投影仪开关。我们需要一步一步的去打开这些开关。如果用代码来实现,就可将灯光,窗帘等都看成一个对象,然后用Client端依次去调用这些对象的开关。

image-20230508211335135

然而,如果我们想直接看电影,这些操作过程我们都可以不需要,我们只需要一个小爱同学音箱,就可以把这些控制都集中再一个控制器上,我们想要看电影,只需要对小爱同学说进入观影模式就好了。所以之前的其他遥控器我们都可以不用关心了,我们只需要关注小爱同学就够了。这个时候我们就可以使用外观模式。

一、外观模式定义

外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。

外观模式可以理解为转换一群接口,客户只要调用这一个接口而不用调用多个接口才能达到目的,也不需关心这个子系统的内部细节。就是解决多个复杂接口带来的使用困难,起到简化用户操作的作用。

二、类图

image-20230507211704047

三、角色职责

外观角色(Facade):提供一个外观接口,对外,它提供一个易于客户端访问的接口,对内,它可以访问子系统中的所有功能。
子系统角色(SubSystem):子系统在整个系统中可以是一个或多个模块,每个模块都有若干类组成,这些类可能相互之间有着比较复杂的关系。
客户端(Client):外观接口调用测试者。

四、代码实现

灯光(子系统角色 SubSystem)

package day10_facade;

public class Light {
    private static Light light = new Light();

    public static Light getInstance() {
        return light;
    }

    public void turnOn() {
        System.out.println("打开灯光...");
    }

    public void turnOff() {
        System.out.println("关闭灯光...");
    }
}

窗帘(子系统角色 SubSystem)

package day10_facade;

public class Curtain {
    private static Curtain curtain = new Curtain();

    public static Curtain getInstance() {
        return curtain;
    }

    public void turnOn() {
        System.out.println("打开窗帘...");
    }

    public void turnOff() {
        System.out.println("关闭窗帘...");
    }
}

投影仪(子系统角色 SubSystem)

package day10_facade;

public class Screen {
    private static Screen screen = new Screen();

    public static Screen getInstance() {
        return screen;
    }

    public void turnOn() {
        System.out.println("打开投影仪...");
    }

    public void turnOff() {
        System.out.println("关闭投影仪...");
    }
}

小爱同学(外观角色 Facade)

package day10_facade;

public class XiaoaiClassmate {
    // 定义子系统对象
    private Light light;
    private Screen screen;
    private Curtain curtain;

    // 通过构造器根据单例模式获得子系统对象
    public XiaoaiClassmate() {
        this.light = Light.getInstance();
        this.screen = Screen.getInstance();
        this.curtain = Curtain.getInstance();
    }

    public void ready() {
        System.out.println("进入观影模式!");
        light.turnOff();
        curtain.turnOff();
        screen.turnOn();
    }

    public void exit() {
        System.out.println("退出观影模式!");
        light.turnOn();
        curtain.turnOn();
        screen.turnOff();
    }
}

测试类

package day10_facade;

public class FacadeTest {
    public static void main(String[] args) {
        XiaoaiClassmate xiaoaiClassmate = new XiaoaiClassmate();
        xiaoaiClassmate.ready();
        xiaoaiClassmate.exit();
    }
}

五、外观模式的应用场景

  1. 对分层结构系统构建时,使用外观模式定义子系统中每层的入口点可以简化子系统之间的依赖关系。当一个复杂系统的子系统很多时,外观模式可以为系统设计一个简单的接口供外界访问

六、总结

外观模式对客户端与子系统的耦合关系,让子系统内部的模块更易维护和扩展。对外屏蔽了子系统的细节,因此外观模式降低了客户端对子系统使用的复杂性。当系统需要进行分层设计时,可以考虑外观模式帮我们更好的划分访问的层次。

posted @ 2023-07-05 21:13  晴天阴天下雨天  阅读(65)  评论(0)    收藏  举报