Java设计模式之外观模式

定义

又名门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体的细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。外观模式是"迪米特法则"的典型应用

结构

  • 外观角色:为多个子系统对外提供一个共同的接口。
  • 子系统角色:实现系统的部分功能,客户可以通过外观角色访问它。

案例

智能家电控制

子系统角色

java 复制代码
public class TV {
    public void on(){
        System.out.println("开电视");
    }
    public void off(){
        System.out.println("关电视");
    }
}

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

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

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

外观角色

java 复制代码
public class Controller {
    private Light light;
    private AirCondition airCondition;
    private TV tv;

    public Controller() {
        this.light = new Light();
        this.airCondition = new AirCondition();
        this.tv = new TV();
    }

    public void control(String command){
        if (command.equals("打开")){
            light.on();
            tv.on();
            airCondition.on();
        }else if (command.equals("关闭")){
            light.off();
            tv.off();
            airCondition.off();
        }else{
            System.out.println("错误指令");
        }
    }
}

测试

java 复制代码
public class Client {
    public static void main(String[] args) {
        Controller controller = new Controller();
        controller.control("打开");
        System.out.println("===========");
        controller.control("关闭");
    }
}

开灯

开电视

开空调

===========

关灯

关电视

关空调

只是实现了简单的一键开关,可以根据Controller中设置不同的子系统管理。

好处

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

缺点

  • 不符合开闭原则,修改很麻烦

使用场景

  • 对分层结构系统构建时,使用外观模式定义子系统中每层的入口点可以简化子系统之间的依赖关系。
  • 当一个复杂系统的子系统很多时,外观模式可以为系统设计一个简单的接口供外界访问。
  • 当客户端与多个子系统之间存在很大的联系时,引入外观模式可将它们分离,从而提高子系统的独立性和可移植性。
相关推荐
四谎真好看21 分钟前
Java 黑马程序员学习笔记(进阶篇18)
java·笔记·学习·学习笔记
桦说编程27 分钟前
深入解析CompletableFuture源码实现(2)———双源输入
java·后端·源码
java_t_t27 分钟前
ZIP工具类
java·zip
lang201509281 小时前
Spring Boot优雅关闭全解析
java·spring boot·后端
pengzhuofan2 小时前
第10章 Maven
java·maven
百锦再2 小时前
Vue Scoped样式混淆问题详解与解决方案
java·前端·javascript·数据库·vue.js·学习·.net
刘一说2 小时前
Spring Boot 启动慢?启动过程深度解析与优化策略
java·spring boot·后端
壹佰大多3 小时前
【spring如何扫描一个路径下被注解修饰的类】
java·后端·spring
百锦再3 小时前
对前后端分离与前后端不分离(通常指服务端渲染)的架构进行全方位的对比分析
java·开发语言·python·架构·eclipse·php·maven
DokiDoki之父3 小时前
Spring—注解开发
java·后端·spring