9、设计模式之外观模式

定义

又名门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用不关心内部子系统的具体细节,这样会大大降低应用程序的复杂性,提高了程序的可维护性。
在这里插入图片描述

案例:智能家电控制系统

小明的爷爷年纪大了,一个人在家生活,每天都要开灯、开电视、开空调;关灯、关电视、关空调。小明给爷爷买了只能音响,可以通过语音控制之前全部开启或全部关闭家电。

在这里插入图片描述
电灯类

package com.hupp.facade;

public class Light {
    
    
    public void on(){
    
    
        System.out.println("开灯");
    }

    public void off(){
    
    
        System.out.println("关灯");
    }
}

电视类

package com.hupp.facade;

public class TV {
    
    
    public void on(){
    
    
        System.out.println("开电视");
    }

    public void off(){
    
    
        System.out.println("关电视");
    }
}

空调类

package com.hupp.facade;

public class AirCondition {
    
    
    public void on(){
    
    
        System.out.println("开空调");
    }

    public void off(){
    
    
        System.out.println("关空调");
    }
}

智能音箱类:外观模式的统一api

package com.hupp.facade;

/**
 * 外观类,主要和客户端交互
 */
public class SmartAppliancesFacade {
    
    
    private Light light;
    private TV tv;
    private AirCondition airCondition;

    public SmartAppliancesFacade() {
    
    
        light = new Light();
        tv = new TV();
        airCondition = new AirCondition();
    }

    public void say(String message) {
    
    
        if (message.contains("打开")) {
    
    
            on();
        } else if(message.contains("关闭")) {
    
    
            off();
        }else{
    
    
            System.out.println("无法识别的语音");
        }
    }

    private void on(){
    
    
        light.on();
        tv.on();
        airCondition.on();
    }

    private void off(){
    
    
        light.off();
        tv.off();
        airCondition.off();
    }
}

客户端

package com.hupp.facade;

public class Client {
    
    
    public static void main(String[] args) {
    
    
        SmartAppliancesFacade facade = new SmartAppliancesFacade();
        facade.say("打开家电");
        System.out.println("-------------");
        facade.say("关闭家电");
    }
}

执行结果
在这里插入图片描述
优点

  • 降低了子系统与客户端之间的耦合度,使得子系统的变化不会影响调用它的客户类。
  • 对客户屏蔽了子系统组件,减少了客户处理的对象数目,并使得子系统更加容易使用

缺点

  • 不符合开闭原则,修改起来比较麻烦

使用场景

  • 当一个复杂的系统的子系统很多时,外观模式可以为系统设计一个简单的接口供外界访问。
  • 当客户端与多个子系统之间存在很大的联系时,使用外观模式可将他们分离,从而提高子系统的独立性和可移植性

猜你喜欢

转载自blog.csdn.net/hpp3501/article/details/111438732