设计模式-结构型模式:外观模式

简介: 设计模式-结构型模式:外观模式

1、简介

外观模式(Facade Pattern)是一种结构性设计模式,它提供了一个简单的接口,隐藏了一个或多个复杂的子系统的复杂性,使得客户端能够更加方便地访问子系统的功能。在外观模式中,客户端只需要与外观对象进行交互,而不需要直接与子系统的组件交互,从而简化了客户端与子系统之间的交互。

2、组成部分

外观模式包含以下几个角色:

  1. Facade(外观)[/fəˈsɑːd/]:外观类是外观模式的核心,它封装了子系统的复杂性,并提供了一个简单的接口给客户端使用。外观类可以了解各个子系统的功能和职责,并根据客户端的需求进行协调和调用。
  2. Subsystem(子系统):子系统是一个或多个类的集合,它们实现了具体的功能,是外观类的组成部分子系统类并不知道外观类的存在,它们只是完成自己的职责。
  3. Client(客户端):客户端是外观模式的使用者,通过外观类访问子系统的功能。

3、优缺点

外观模式(Facade Pattern)是一种结构型设计模式,它将系统中的复杂子系统封装在一个统一的接口中,为客户端提供简单易用的接口,从而降低客户端的使用难度,同时提高系统的可维护性和扩展性。它的优点和缺点如下:

优点:

  1. 简化客户端与子系统之间的交互:外观模式提供了一个简单的接口,使客户端与子系统之间的交互变得简单。客户端只需要调用外观类提供的接口,就能完成复杂的操作,而不需要了解子系统的具体实现细节。
  2. 实现系统中各个模块之间的松耦合:外观模式可以实现系统中各个模块之间的松耦合,因为客户端只需要与外观类进行交互,而不需要与子系统的具体实现细节进行交互。这样,系统的扩展性和维护性都会得到提高。
  3. 提高代码的可维护性:外观模式将子系统的实现细节封装在外观类中,使得代码更加清晰、易于理解和维护。
  4. 提高代码的复用性:外观模式可以通过封装子系统的接口,使得系统中的多个模块可以共享同一个外观类,从而提高代码的复用性。
  5. 降低风险:外观模式可以将子系统的接口隐藏在外观类中,从而减少接口变化对客户端的影响,降低风险。

缺点:

  1. 不符合开闭原则:外观模式在增加新的功能时,需要修改外观类的代码,这违反了开闭原则。因此,在使用外观模式时,需要注意不要让外观类变得过于庞大,应该根据需要对外观类进行拆分。
  2. 可能会影响性能:由于外观模式需要进行一定程度的封装,因此可能会增加系统的复杂性和运行时的开销。如果系统的性能要求比较高,可能需要权衡使用外观模式的代价。

总之,外观模式的优点在于它能够简化系统的复杂性,提高系统的可维护性和扩展性,缺点在于它可能会影响系统的性能,同时需要注意不要违反开闭原则

4、使用场景

外观模式(Facade Pattern)通常适用于以下场景:

  1. 将复杂系统的子系统进行封装:外观模式可以将复杂系统中的子系统进行封装,从而提供一个简单的接口给客户端使用。客户端只需要通过外观类与子系统进行交互,而无需了解子系统的具体实现细节。
  2. 提供简单易用的接口:外观模式可以提供一个简单易用的接口给客户端使用,从而降低客户端的使用难度。客户端只需要调用外观类提供的接口,就能完成复杂的操作。
  3. 实现松耦合:外观模式可以实现系统中各个模块之间的松耦合,因为客户端只需要与外观类进行交互,而不需要与子系统的具体实现细节进行交互。这样,系统的扩展性和维护性都会得到提高。
  4. 系统接口改变的风险:如果系统中某个子系统的接口发生变化,可能会对客户端造成影响。使用外观模式可以将子系统的接口隐藏在外观类中,从而减少接口变化对客户端的影响。
  5. 系统需要向外部提供统一的接口:外观模式可以将系统的多个子系统封装在一个外观类中,从而向外部提供一个统一的接口。这样,外部系统只需要与外观类进行交互,就可以使用系统中的多个子系统的功能。

5、代码实现

下面通过Java代码来展示如何使用外观模式,以更好地说明外观模式的实现过程和作用。

我们假设有一个复杂的系统,由多个子系统组成,每个子系统都有自己的一组接口

我们想要实现一个简单易用的接口,让客户端能够方便地使用系统,而不需要了解系统的复杂实现细节。

这时候就可以使用外观模式来实现。

首先,我们需要定义一个外观类,作为客户端与子系统之间的中介。这个外观类将封装子系统的一组接口,并提供一个简单易用的接口供客户端使用。以下是外观类的实现:

1. public class SystemFacade {
2. private SubSystemA subSystemA;
3. private SubSystemB subSystemB;
4. 
5. public SystemFacade() {
6. this.subSystemA = new SubSystemA();
7. this.subSystemB = new SubSystemB();
8.     }
9. 
10. public void operation() {
11.         subSystemA.operationA();
12.         subSystemB.operationB();
13.     }
14. }

在上面的代码中,定义了一个SystemFacade类作为外观类,它包含了两个子系统的对象,即SubSystemA和SubSystemB。在SystemFacade类中,我们定义了一个operation()方法,它封装了子系统的一组接口,提供一个简单易用的接口供客户端使用。

接下来,我们需要定义子系统的接口和实现。以下是SubSystemA类和SubSystemB类的实现:

1. public class SubSystemA {
2. public void operationA() {
3.         System.out.println("SubSystemA operationA.");
4.     }
5. }
1. public class SubSystemB {
2. public void operationB() {
3.         System.out.println("SubSystemB operationB.");
4.     }
5. }

最后,我们可以通过客户端来使用系统。以下是客户端的实现:

1. public class Client {
2. public static void main(String[] args) {
3. SystemFacade facade = new SystemFacade();
4.         facade.operation();
5.     }
6. }

在上面的代码中,我们创建了一个SystemFacade对象,然后调用它的operation()方法。由于operation()方法已经封装了子系统的实现细节,客户端可以非常方便地使用系统,而不需要了解系统的复杂实现细节。

通过上面的代码实现,我们可以看到外观模式的作用是封装子系统的一组接口,提供一个简单易用的接口供客户端使用,从而简化了客户端与子系统之间的交互,提高了系统的可维护性和扩展性。

6、补充:子类和外观类的关系

子系统中的组件或对象负责实现具体的业务逻辑,它们通常被外观类封装起来,外观类向客户端暴露的接口是由子系统中的组件或对象共同协作完成的。

在外观模式中,子系统与外观类之间的关系通常是一种聚合关系。外观类持有子系统的引用,并调用子系统的接口来实现具体的业务逻辑。同时,外观类还可以根据具体的业务需求,封装一些子系统的接口,从而简化客户端的使用。

总之,子系统是外观类的实现基础,而外观类是客户端与子系统之间的中间件,它们共同协作,实现了复杂系统的简化和解耦。

相关文章
|
9月前
|
设计模式 存储 缓存
【设计模式】【结构型模式】享元模式(Flyweight)
一、入门 什么是享元模式? 享元模式(Flyweight Pattern)是一种结构型设计模式,旨在通过共享对象来减少内存使用,特别适用于存在大量相似对象的情况。 它的核心思想是将对象的内在状态(不变
317 16
|
9月前
|
设计模式 Java 数据库连接
【设计模式】【结构型模式】代理模式(Proxy)
一、入门 什么是代理模式? 代理模式(Proxy Pattern)是一种结构型设计模式,允许你提供一个代理对象来控制对另一个对象的访问。 代理对象在客户端和目标对象之间起到中介作用,可以在不改变目标对
274 10
|
9月前
|
设计模式 Java 定位技术
【设计模式】【结构型模式】组合模式(Composite)
一、入门 什么是组合模式 组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次关系。组合模式使得客户端可以统一处理单个对象和组合对
296 10
|
9月前
|
关系型数据库 Java MySQL
【设计模式】【结构型模式】桥接模式(Bridge)
一、入门 什么是桥接模式? 桥接模式(Bridge Pattern)是一种结构型设计模式,核心思想是将抽象与实现分离,让它们可以独立变化。简单来说,它像一座“桥”连接了两个维度的变化,避免用继承导致代
471 10
|
9月前
|
设计模式 前端开发 Java
【设计模式】【结构型模式】适配器模式(Adpter)
一、入门 什么是适配器模式? 适配器模式是Java中常用的结构型设计模式,它的核心作用就像现实中的电源转换器一样---让原本不兼容的两个接口能够协同工作。 为什么要用适配器模式? 假设我们需要在电商系
240 10
|
9月前
|
设计模式 Java 数据库连接
【设计模式】【结构型模式】外观模式(Facde)
一、入门 什么是外观模式? 一种结构型设计模式,通过为子系统中的一组接口提供一个统一的高层接口(称为外观),来简化客户端与复杂子系统的交互过程。其本质是建立抽象层来隔离复杂度。 为什么要有外观模式?
365 9
|
9月前
|
设计模式 缓存 安全
【设计模式】【结构型模式】装饰者模式(Decorator)
一、入门 什么是装饰者模式? 装饰者模式(Decorator Pattern)是 Java 中常用的结构型设计模式,它能在不修改原有对象结构的前提下,动态地为对象添加额外的职责。 为什么要装饰者模式?
236 8
|
设计模式 缓存 应用服务中间件
「全网最细 + 实战源码案例」设计模式——外观模式
外观模式(Facade Pattern)是一种结构型设计模式,旨在为复杂的子系统提供一个统一且简化的接口。通过封装多个子系统的复杂性,外观模式使外部调用更加简单、易用。例如,在智能家居系统中,外观类可以同时控制空调、灯光和电视的开关,而用户只需发出一个指令即可。
324 69
|
设计模式 存储 Java
【九】设计模式~~~结构型模式~~~外观模式(Java)
文章详细介绍了外观模式(Facade Pattern),这是一种对象结构型模式,通过引入一个外观类来简化客户端与多个子系统之间的交互,降低系统的耦合度,并提供一个统一的高层接口来使用子系统。通过文件加密模块的实例,展示了外观模式的动机、定义、结构、优点、缺点以及适用场景,并讨论了如何通过引入抽象外观类来提高系统的可扩展性。
【九】设计模式~~~结构型模式~~~外观模式(Java)
|
设计模式 缓存 Java
【十一】设计模式~~~结构型模式~~~代理模式(Java)
文章详细介绍了代理模式(Proxy Pattern),这是一种对象结构型模式,用于给对象提供一个代理以控制对它的访问。文中阐述了代理模式的动机、定义、结构、优点、缺点和适用环境,并探讨了远程代理、虚拟代理、保护代理等不同代理形式。通过一个商务信息查询系统的实例,展示了如何使用代理模式来增加身份验证和日志记录功能,同时保持客户端代码的无差别对待。此外,还讨论了代理模式在分布式技术和Spring AOP中的应用,以及动态代理的概念。
【十一】设计模式~~~结构型模式~~~代理模式(Java)