深入浅出设计模式 - 外观模式

简介: 深入浅出设计模式 - 外观模式

博主介绍: ✌博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家✌

Java知识图谱点击链接:体系化学习Java(Java面试专题)

💕💕 感兴趣的同学可以收藏关注下不然下次找不到哟💕💕

1687870364823.jpg

1、什么是外观模式

外观模式是一种结构型设计模式,它提供了一个简单的接口,用于访问复杂系统的一组接口。它将系统的复杂性隐藏在一个单独的外观类中,使客户端代码更加简洁和易于使用。外观模式的核心思想是将系统的各个部分解耦,使它们能够独立地变化。客户端只需要与外观类交互,而不需要了解系统的内部实现。外观模式通常用于简化大型系统的接口,以及隐藏系统的复杂性。在外观模式中,通常会定义一个外观类,它包含一组简单的方法,用于访问系统的各个部分。这些方法可以将客户端请求转发给系统的不同部分,并返回结果。外观类还可以提供一些额外的功能,例如缓存、日志记录等。

2、外观模式的优缺点

外观模式的优点:

  1. 简化客户端代码:外观模式可以隐藏系统的复杂性,使客户端代码更加简洁和易于使用。

  2. 解耦系统的各个部分:外观模式可以将系统的各个部分解耦,使它们能够独立地变化。这样,系统的某个部分的变化不会影响到其他部分。

  3. 提高系统的可维护性:外观模式可以将系统的复杂性隐藏在一个单独的外观类中,使代码更加清晰和易于维护。

  4. 提高系统的安全性:外观类可以控制客户端访问系统的部分,从而提高系统的安全性。

外观模式的缺点:

  1. 不能很好地支持细粒度的控制:外观模式提供了一组简单的接口,用于访问系统的各个部分。如果需要更细粒度的控制,可能需要修改外观类或者直接访问系统的各个部分。

  2. 增加了系统的复杂性:外观模式需要引入一个额外的外观类,这可能会增加系统的复杂性。

  3. 可能会影响系统的性能:如果外观类的实现不够高效,可能会影响系统的性能。

    3、外观模式的应用场景

外观模式适用于以下场景:

  1. 当系统的某个部分变得复杂时,可以使用外观模式将其封装起来,使客户端代码更加简洁和易于使用。

  2. 当需要将系统的各个部分解耦时,可以使用外观模式。这样,系统的某个部分的变化不会影响到其他部分。

  3. 当需要提高系统的可维护性时,可以使用外观模式。外观模式可以将系统的复杂性隐藏在一个单独的外观类中,使代码更加清晰和易于维护。

  4. 当需要提高系统的安全性时,可以使用外观模式。外观类可以控制客户端访问系统的部分,从而提高系统的安全性。

  5. 当需要为客户端提供一个简单的接口时,可以使用外观模式。外观模式可以将系统的复杂性隐藏在一个单独的外观类中,使客户端代码更加简单和易于使用。

    4、外观模式的结构

外观模式的结构包括以下几个部分:

  1. 外观类(Facade):外观类是外观模式的核心,它提供了一个简单的接口,用于访问系统的一组接口。外观类通常包含一组简单的方法,用于将客户端请求转发给系统的不同部分,并返回结果。

  2. 子系统类(Subsystem):子系统类是系统的各个部分,它们实现了系统的各种功能。子系统类可以是一个或多个类,它们之间可能存在依赖关系。

  3. 客户端(Client):客户端是使用外观模式的代码,它通过外观类访问系统的各个部分。客户端不需要了解系统的内部实现,只需要与外观类交互即可。

外观模式的结构图如下所示:

|   Facade     |
+--------------+
| + method1()  |
| + method2()  |
| + method3()  |
+--------------+
        |
        | 1..*
+--------------+          +--------------+
|  Subsystem   |          |  Subsystem   |
+--------------+          +--------------+
| + method1()  |          | + method1()  |
| + method2()  |          | + method2()  |
| + method3()  |          | + method3()  |
+--------------+          +--------------+
        |                        |
        |                        |
        +------------------------+
                    |
                    |
             +--------------+
             |   Client     |
             +--------------+

在这个结构中,外观类充当了系统的门面,它将客户端请求转发给系统的各个部分。客户端只需要与外观类交互,而不需要了解系统的内部实现。子系统类实现了系统的各种功能,它们之间可能存在依赖关系。客户端通过外观类访问子系统类,从而完成各种操作。

5、外观模式的代码案例

我们以电脑为例:

package com.pany.camp.design.principle.facade;

/**
 *
 * @description:  CPU
 * @copyright: @Copyright (c) 2022 
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0 
 * @createTime: 2023-06-27 20:58
 */
public class CPU {
   
   

    public void freeze() {
   
   
        System.out.println("CPU freeze.");
    }

    public void jump(long position) {
   
   
        System.out.println("CPU jump to position: " + position);
    }

    public void execute() {
   
   
        System.out.println("CPU execute.");
    }

    public void stop() {
   
   
        System.out.println("CPU stop.");
    }
}
package com.pany.camp.design.principle.facade;

/**
 *
 * @description:  内存
 * @copyright: @Copyright (c) 2022
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0
 * @createTime: 2023-06-27 21:02
 */
public class Memory {
   
   

    public void load(long position, byte[] data) {
   
   
        System.out.println("Load data to memory position: " + position);
    }
}
package com.pany.camp.design.principle.facade;

/**
 *
 * @description:  硬件驱动
 * @copyright: @Copyright (c) 2022
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0
 * @createTime: 2023-06-27 21:00
 */
public class HardDrive {
   
   

    public byte[] read(long sector, int size) {
   
   
        System.out.println("Read data from hard drive sector: " + sector + ", size: " + size);
        return new byte[size];
    }
}
package com.pany.camp.design.principle.facade;

/**
 *
 * @description:  
 * @copyright: @Copyright (c) 2022 
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0 
 * @createTime: 2023-06-27 20:58
 */

public class Computer {
   
   
    private CPU cpu;
    private Memory memory;
    private HardDrive hardDrive;

    public Computer() {
   
   
        this.cpu = new CPU();
        this.memory = new Memory();
        this.hardDrive = new HardDrive();
    }

    // 启动电脑
    public void startComputer() {
   
   
        cpu.freeze();
        memory.load(BOOT_ADDRESS, hardDrive.read(BOOT_SECTOR, SECTOR_SIZE));
        cpu.jump(BOOT_ADDRESS);
        cpu.execute();
    }

    // 关闭电脑
    public void stopComputer() {
   
   
        cpu.stop();
    }

    // 内存地址
    private static final long BOOT_ADDRESS = 0x00000000;

    // 磁盘扇区大小
    private static final int SECTOR_SIZE = 512;

    // 引导扇区号
    private static final long BOOT_SECTOR = 0x00000000;
}
package com.pany.camp.design.principle.facade;

/**
 *
 * @description:  客户端
 * @copyright: @Copyright (c) 2022
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0
 * @createTime: 2023-06-27 21:03
 */
public class Client {
   
   

    public static void main(String[] args) {
   
   
        Computer computer = new Computer();
        computer.startComputer();
        computer.stopComputer();
    }
}

外观类为 Computer ,它包含了子系统类 CPU 、 Memory 和 HardDrive 。 CPU 、 Memory 和 HardDrive 实现了系统的各种功能。客户端通过 Computer 类访问这些子系统类,从而完成各种操作。

具体来说, Computer 类中的 startComputer() 方法实现了启动电脑的功能,它调用了 CPU 、 Memory 和 HardDrive 类的方法来完成这个过程。 stopComputer() 方法实现了关闭电脑的功能,它调用了 CPU 类的方法来完成这个过程。

CPU 、 Memory 和 HardDrive 类分别实现了系统的CPU、内存和硬盘功能。 CPU 类的方法包括 freeze() 、 jump() 、 execute() 和 stop() ,分别对应CPU的冻结、跳转、执行和停止操作。 Memory 类的方法包括 load() ,用于将数据加载到内存中。 HardDrive 类的方法包括 read() ,用于从硬盘中读取数据。

客户端通过创建 Computer 对象来访问系统的各种功能。在 main() 方法中,客户端创建了一个 Computer 对象,并调用了它的 startComputer() 和 stopComputer() 方法来启动和关闭电脑。

输出的结果如下:

CPU freeze.
Read data from hard drive sector: 0, size: 512
Load data to memory position: 0
CPU jump to position: 0
CPU execute.
CPU stop.

Process finished with exit code 0

1686494501743.jpg

💕💕 本文由激流原创,首发于CSDN博客,博客主页 https://blog.csdn.net/qq_37967783?spm=1010.2135.3001.5421
💕💕喜欢的话记得点赞收藏啊

1687869804912.jpg

目录
相关文章
|
1月前
|
设计模式 Java
23种设计模式,外观模式的概念优缺点以及JAVA代码举例
【4月更文挑战第6天】外观模式(Facade Pattern)是一种使用频率非常高的结构型设计模式,其核心思想是为子系统中的一组接口提供一个一致的界面。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。简而言之,外观模式就是客户端与复杂子系统之间的一个简单而统一的接口
41 3
|
1月前
|
设计模式 API 数据安全/隐私保护
探索设计模式的魅力:外观模式简化术-隐藏复杂性,提供简洁接口的设计秘密
外观模式是一种关键的设计模式,旨在通过提供一个简洁的接口来简化复杂子系统的访问。其核心价值在于将复杂的内部实现细节封装起来,仅通过一个统一的外观对象与客户端交互,从而降低了系统的使用难度和耦合度。在软件开发中,外观模式的重要性不言而喻。它不仅能够提高代码的可读性、可维护性和可扩展性,还能促进团队间的协作和沟通。此外,随着业务需求和技术的发展,外观模式能够适应变化,通过修改外观对象来灵活调整客户端与子系统之间的交互方式。总之,外观模式在软件设计中扮演着举足轻重的角色,是构建高效、稳定且易于维护的软件系统的关键
86 1
探索设计模式的魅力:外观模式简化术-隐藏复杂性,提供简洁接口的设计秘密
|
1月前
|
设计模式 存储 uml
C++ 设计模式实战:外观模式和访问者模式的结合使用,派生类访问基类的私有子系统
C++ 设计模式实战:外观模式和访问者模式的结合使用,派生类访问基类的私有子系统
39 1
|
1月前
|
设计模式
设计模式-外观模式
设计模式-外观模式
34 0
|
1月前
|
设计模式 Go 开发工具
Golang设计模式——03外观模式
Golang设计模式——03外观模式
26 0
|
1月前
|
设计模式 Java 应用服务中间件
设计模式 -结构型模式_门面模式(外观模式) Facade Pattern 在开源软件中的应用
设计模式 -结构型模式_门面模式(外观模式) Facade Pattern 在开源软件中的应用
39 1
|
1月前
|
设计模式 API
【设计模式】什么是外观模式并给出例子!
【设计模式】什么是外观模式并给出例子!
20 0
|
1月前
|
设计模式 前端开发 Java
Java设计模式【十一】:外观模式
Java设计模式【十一】:外观模式
28 0
|
1月前
|
设计模式 JavaScript 前端开发
[设计模式Java实现附plantuml源码~结构型] 提供统一入口——外观模式
[设计模式Java实现附plantuml源码~结构型] 提供统一入口——外观模式
|
1月前
|
设计模式 Go API
[设计模式 Go实现] 结构型~外观模式
[设计模式 Go实现] 结构型~外观模式