JAVA设计模式10:外观模式,使得客户端可以通过简单的接口与子系统交互

作者主页Designer 小郑
作者简介:3年JAVA全栈开发经验,专注JAVA技术、系统定制、远程指导,致力于企业数字化转型,CSDN博客专家,阿里云社区专家博主,蓝桥云课讲师。


在这里插入图片描述

一、什么是外观模式

外观模式是一种结构型设计模式,它提供了一个统一的接口,用于访问子系统中的一组接口,外观模式隐藏了子系统的复杂性,使得客户端可以通过简单的接口与子系统交互,而不需要了解子系统的内部细节。

在外观模式中,外观类充当了客户端和子系统之间的中介,它封装了一组子系统的接口,并提供了一个简单的、高级别的接口供客户端使用。

外观模式有以下 2 2 2 个关键角色。

  1. 外观(Facade):外观类是外观模式的核心,它提供了一个简单的接口,包装了一组复杂的子系统接口,以便客户端可以方便地使用。
  2. 子系统(Subsystem):子系统包含了一组相关的类和接口,完成具体的功能。客户端可以通过外观类间接地访问子系统中的功能。

外观模式的优点包括以下 3 3 3 类。

  1. 简化了客户端与子系统之间的交互,客户端可以通过外观类的统一接口来访问子系统,而不需要了解子系统的具体实现。
  2. 隐藏了子系统的复杂性,客户端不需要了解子系统的内部结构和细节,只需要使用外观类提供的接口即可。
  3. 降低了客户端的耦合度,客户端只依赖外观类,不需要直接依赖子系统的接口。

外观模式的应用场景包括以下 3 3 3 类。

  1. 当一个复杂的子系统需要被简化或者解耦时,可以考虑使用外观模式。
  2. 当需要提供一个简单的接口来访问复杂的子系统时,可以使用外观模式来封装子系统的接口。
  3. 当存在多个子系统,而客户端只需要与其中一个子系统交互时,可以使用外观模式来提供统一的接口。

外观模式可以简化客户端与子系统之间的交互,提供了一个简单的接口,隐藏了子系统的复杂性,降低了客户端的耦合度,是一种常用的设计模式。

在这里插入图片描述


二、外观模式实例

以下是一个简单的 Java 代码示例,展示了外观模式的实现,请同学们复制到本地执行。

// 子系统A
class SubsystemA {
    
    
    public void operationA() {
    
    
        System.out.println("Subsystem A operation");
    }
}

// 子系统B
class SubsystemB {
    
    
    public void operationB() {
    
    
        System.out.println("Subsystem B operation");
    }
}

// 外观类
class Facade {
    
    
    private SubsystemA subsystemA;
    private SubsystemB subsystemB;
    
    public Facade() {
    
    
        subsystemA = new SubsystemA();
        subsystemB = new SubsystemB();
    }
    
    public void operation() {
    
    
        subsystemA.operationA();
        subsystemB.operationB();
    }
}

// 客户端
public class Client {
    
    
    public static void main(String[] args) {
    
    
        Facade facade = new Facade();
        facade.operation();
    }
}

在上述示例中,SubsystemASubsystemB 是两个具体的子系统,分别有各自的操作。

Facade 是外观类,它封装了子系统的接口,并提供了一个简单的操作方法 operation()

客户端通过调用外观类的操作方法来使用子系统,而不需要直接与子系统进行交互。

运行客户端代码后,输出结果为:

Subsystem A operation
Subsystem B operation

外观模式将复杂的子系统接口进行了封装,同时隐藏了子系统的复杂性,提供了一个简单的接口供客户端使用,客户端只需要与外观类进行交互,而不需要了解子系统的具体实现细节。

在这里插入图片描述


三、外观模式的应用场景

外观模式在以下情况下可以被用来简化系统复杂性,并提供一个简单的接口供客户端访问子系统,有以下 5 5 5 种应用场景。

  1. 当系统存在复杂的子系统,并且需要对外提供简单的接口时,可以使用外观模式。外观模式可以封装子系统的复杂性,为客户端提供一个简单、统一的接口,从而减少客户端与子系统之间的耦合度。
  2. 当需要解耦客户端和子系统之间的关系时,可以使用外观模式。外观模式将子系统封装在一个外观类中,客户端只需要与外观类交互,而不需要直接依赖子系统的接口,从而降低了客户端的耦合度。
  3. 当需要对多个子系统进行统一管理时,可以使用外观模式。外观模式可以提供一个统一的接口,集成多个子系统的功能,方便客户端进行管理和调用。
  4. 当需要对子系统进行分层封装时,可以使用外观模式。外观模式可以将子系统分为多个层次,每个层次提供不同的接口,从而实现对子系统的灵活管理。
  5. 当需要在系统中引入新的子系统时,可以使用外观模式。通过外观模式,可以在不影响客户端的情况下,对新的子系统进行封装和集成,从而实现系统的扩展和升级。

外观模式适用于需要简化复杂系统、解耦客户端和子系统、统一管理多个子系统、分层封装子系统、引入新的子系统等场景,它能够提高系统的可维护性、可扩展性和灵活性。

在这里插入图片描述


四、外观模式面试题

  1. 解释什么是外观模式,并提供一个实际的例子。
  2. 外观模式有什么优点和缺点?
  3. 外观模式与适配器模式有何区别?
  4. 外观模式和单例模式是否可以同时使用?
  5. 如何在Java中实现外观模式?
  6. 外观模式的适用场景是什么?
  7. 请给出一个使用外观模式的真实案例。
  8. 如何在外观模式中处理子系统之间的依赖关系?
  9. 外观模式和代理模式有何区别?
  10. 如果需要添加一个新的子系统,如何在外观模式中进行扩展?

在这里插入图片描述


猜你喜欢

转载自blog.csdn.net/qq_41464123/article/details/133125894