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

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

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、补充:子类和外观类的关系

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

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

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

相关文章
|
2月前
|
设计模式 Java
Java设计模式-外观模式(11)
Java设计模式-外观模式(11)
|
1月前
|
设计模式 Java
Java设计模式之外观模式
这篇文章详细解释了Java设计模式之外观模式的原理及其应用场景,并通过具体代码示例展示了如何通过外观模式简化子系统的使用。
29 0
|
3月前
|
设计模式 存储 Java
【十】设计模式~~~结构型模式~~~享元模式(Java)
文章详细介绍了享元模式(Flyweight Pattern),这是一种对象结构型模式,通过共享技术实现大量细粒度对象的重用,区分内部状态和外部状态来减少内存中对象的数量,提高系统性能。通过围棋棋子的设计案例,展示了享元模式的动机、定义、结构、优点、缺点以及适用场景,并探讨了单纯享元模式和复合享元模式以及与其他模式的联用。
【十】设计模式~~~结构型模式~~~享元模式(Java)
|
3月前
|
设计模式 存储 Java
【九】设计模式~~~结构型模式~~~外观模式(Java)
文章详细介绍了外观模式(Facade Pattern),这是一种对象结构型模式,通过引入一个外观类来简化客户端与多个子系统之间的交互,降低系统的耦合度,并提供一个统一的高层接口来使用子系统。通过文件加密模块的实例,展示了外观模式的动机、定义、结构、优点、缺点以及适用场景,并讨论了如何通过引入抽象外观类来提高系统的可扩展性。
【九】设计模式~~~结构型模式~~~外观模式(Java)
|
3月前
|
设计模式 Java
【八】设计模式~~~结构型模式~~~装饰模式(Java)
文章详细介绍了装饰模式(Decorator Pattern),这是一种对象结构型模式,用于在不使用继承的情况下动态地给对象添加额外的职责。装饰模式通过关联机制,使用装饰器类来包装原有对象,并在运行时通过组合的方式扩展对象的行为。文章通过图形界面构件库的设计案例,展示了装饰模式的动机、定义、结构、优点、缺点以及适用场景,并提供了Java代码实现和应用示例。装饰模式提高了系统的灵活性和可扩展性,适用于需要动态、透明地扩展对象功能的情况。
【八】设计模式~~~结构型模式~~~装饰模式(Java)
|
3月前
|
设计模式 XML 存储
【七】设计模式~~~结构型模式~~~桥接模式(Java)
文章详细介绍了桥接模式(Bridge Pattern),这是一种对象结构型模式,用于将抽象部分与实现部分分离,使它们可以独立地变化。通过实际的软件开发案例,如跨平台视频播放器的设计,文章阐述了桥接模式的动机、定义、结构、优点、缺点以及适用场景,并提供了完整的代码实现和测试结果。桥接模式适用于存在两个独立变化维度的系统,可以提高系统的可扩展性和灵活性。
【七】设计模式~~~结构型模式~~~桥接模式(Java)
|
3月前
|
设计模式 XML 存储
【六】设计模式~~~结构型模式~~~适配器模式(Java)
文章详细介绍了适配器模式(Adapter Pattern),这是一种结构型设计模式,用于将一个类的接口转换成客户期望的另一个接口,使原本不兼容的接口能够一起工作,提高了类的复用性和系统的灵活性。通过对象适配器和类适配器两种实现方式,展示了适配器模式的代码应用,并讨论了其优点、缺点以及适用场景。
|
3月前
|
设计模式 缓存 Java
【十一】设计模式~~~结构型模式~~~代理模式(Java)
文章详细介绍了代理模式(Proxy Pattern),这是一种对象结构型模式,用于给对象提供一个代理以控制对它的访问。文中阐述了代理模式的动机、定义、结构、优点、缺点和适用环境,并探讨了远程代理、虚拟代理、保护代理等不同代理形式。通过一个商务信息查询系统的实例,展示了如何使用代理模式来增加身份验证和日志记录功能,同时保持客户端代码的无差别对待。此外,还讨论了代理模式在分布式技术和Spring AOP中的应用,以及动态代理的概念。
【十一】设计模式~~~结构型模式~~~代理模式(Java)
|
4月前
|
设计模式 JavaScript 前端开发
js设计模式【详解】—— 外观模式
js设计模式【详解】—— 外观模式
37 2
|
5月前
|
设计模式 Java
Java设计模式:外观模式之优雅门面(九)
Java设计模式:外观模式之优雅门面(九)

热门文章

最新文章

  • 1
    C++一分钟之-设计模式:工厂模式与抽象工厂
    43
  • 2
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    50
  • 3
    C++一分钟之-C++中的设计模式:单例模式
    58
  • 4
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    38
  • 5
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    63
  • 6
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    58
  • 7
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    42
  • 8
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    50
  • 9
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    110
  • 10
    Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
    78