聊聊设计模式——外观模式

发布时间:2023年12月22日

目录

1.外观模式定义

2.优点

3.缺点

4.外观模式的关键组件包括

5.示例

6.工作流程

7.应用场景

8.本质

9.涉及的设计原则

10.与其他设计模式的关系


外观模式定义

为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

优点
  1. 简化接口:外观模式提供了一个简化的接口,隐藏了系统复杂性,使客户端更容易使用。

  2. 解耦客户端和子系统:外观模式将客户端与子系统解耦,客户端不需要了解子系统的实现细节。

  3. 提高可维护性:外观模式将系统的组件隔离,改变系统时只需要修改外观而不影响客户端。

  4. 遵循单一职责原则:每个子系统负责自己的功能,符合单一职责原则。

缺点
  1. 可能导致外观对象过于臃肿:如果系统变得非常复杂,外观对象可能会变得庞大,难以维护。

  2. 限制灵活性:外观模式隐藏了子系统的复杂性,但也可能限制了客户端对子系统的灵活访问。

外观模式的结构说明
  1. 外观(Facade):外观是客户端与子系统之间的接口,它提供了一个简化的接口,封装了对子系统的调用,客户端通过外观来访问系统。

  2. 子系统(Subsystems):子系统是一组相关的类或接口,它们实现了系统的具体功能,但对客户端来说可能过于复杂。外观通过与子系统交互来完成客户端的请求。

示例

创建一个Facade类,提供一个统一的接口,用来访问子系统中的一群接口:

/*
结构型-外观(门面)模式:提供一个统一的接口,用来访问子系统中的一群接口,从而让子系统更容易使用。
 */
public class Facade {
    private SubSystem subSystem = new SubSystem();

    public void watchTV(){
        subSystem.turnOnTV();
        subSystem.changeChannel();
        subSystem.turnOffTV();
    }
}

创建子系统:

public class SubSystem {
    public void turnOnTV(){
        System.out.println("打开电视");
    };
    public void turnOffTV(){
        System.out.println("关闭电视");
    };
    public void changeChannel(){
        System.out.println("转换频道");
    };

}

客户端代码:?

public class FacadeClient {
    // 普通实现:客户端需要与子系统内部多个模块交互,强耦合
    public static void main(String[] args) {
        SubSystem subSystem = new SubSystem();
        subSystem.turnOnTV();
        subSystem.changeChannel();
        subSystem.turnOffTV();

        // 外观模式下,只需要直接使用门面对象
        new Facade().watchTV();
    }
}
工作流程:
  1. 客户端通过外观接口与外观对象交互。

  2. 外观对象将请求转发给相应的子系统。

  3. 子系统执行请求并将结果返回给外观对象。

  4. 外观对象将结果返回给客户端,客户端无需了解子系统的详细实现。

应用场景:

外观模式适用于以下情况:

  1. 当系统拥有复杂的子系统结构,而客户端只需与系统的部分功能交互时,可以使用外观模式。

  2. 当希望封装系统的复杂性,提供一个简单的接口给客户端时,可以使用外观模式。

  3. 当需要解耦客户端和子系统之间的依赖关系时,可以使用外观模式。

本质:

外观模式的本质是为系统提供一个高层次的接口,以封装和简化复杂的子系统。

涉及的设计原则:
  1. 单一职责原则(Single Responsibility Principle):外观模式有助于确保每个子系统负责自己的功能,符合单一职责原则。

  2. 封装原则(Encapsulation Principle):外观模式通过封装子系统的复杂性,提供了一个简化的接口。

相关设计模式:
  • 适配器模式(Adapter Pattern):适配器模式用于将一个接口转换为另一个接口,而外观模式用于简化接口,使其更易于使用。
  • 单例模式(Singleton Pattern):外观模式中的外观对象通常是单例的,以确保系统中只有一个外观对象。
  • 抽象工厂模式(Abstract Factory Pattern):外观模式可以与抽象工厂模式一起使用,以提供一个更高级别的接口来创建一组相关对象。

框架示例:

一个示例是在图形用户界面(GUI)开发中使用外观模式。GUI库可以提供一个外观对象,使开发者能够更容易地创建窗口、按钮、文本框等界面元素,而无需了解每个元素的复杂构建和交互细节。这种方式简化了GUI开发,隐藏了底层窗口系统的复杂性。

文章来源:https://blog.csdn.net/Elaine2391/article/details/132782000
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。