关于我们

质量为本、客户为根、勇于拼搏、务实创新

< 返回新闻公共列表

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

发布时间:2023-06-27 22:00:15
博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家 Java知识图谱点击链接:体系化学习Java(Java面试专题) 感兴趣的同学可以收藏关注下 ,不然下次找不到哟 1、什么是外观模式 外观模式是一种结构型设计模式,它提供了一个简单的接口,用于访问复杂系统的一组接口。它将系统的复杂性隐藏在一个单独的外观类中,使客户端代码更加简洁和易于使用。外观模式的核心思想是将系统的各个部分解耦,使它们能够独立地变化。客户端只需要与外观类交互,而不需要了解系统的内部实现。外观模式通常用于简化大型系统的接口,以及隐藏系统的复杂性。在外观模式中,通常会定义一个外观类,它包含一组简单的方法,用于访问系统的各个部分。这些方法可以将客户端请求转发给系统的不同部分,并返回结果。外观类还可以提供一些额外的功能,例如缓存、日志记录等。 2、外观模式的优缺点 外观模式的优点: 简化客户端代码:外观模式可以隐藏系统的复杂性,使客户端代码更加简洁和易于使用。 解耦系统的各个部分:外观模式可以将系统的各个部分解耦,使它们能够独立地变化。这样,系统的某个部分的变化不会影响到其他部分。 提高系统的可维护性:外观模式可以将系统的复杂性隐藏在一个单独的外观类中,使代码更加清晰和易于维护。 提高系统的安全性:外观类可以控制客户端访问系统的部分,从而提高系统的安全性。 外观模式的缺点: 不能很好地支持细粒度的控制:外观模式提供了一组简单的接口,用于访问系统的各个部分。如果需要更细粒度的控制,可能需要修改外观类或者直接访问系统的各个部分。 增加了系统的复杂性:外观模式需要引入一个额外的外观类,这可能会增加系统的复杂性。 可能会影响系统的性能:如果外观类的实现不够高效,可能会影响系统的性能。 3、外观模式的应用场景 外观模式适用于以下场景: 当系统的某个部分变得复杂时,可以使用外观模式将其封装起来,使客户端代码更加简洁和易于使用。 当需要将系统的各个部分解耦时,可以使用外观模式。这样,系统的某个部分的变化不会影响到其他部分。 当需要提高系统的可维护性时,可以使用外观模式。外观模式可以将系统的复杂性隐藏在一个单独的外观类中,使代码更加清晰和易于维护。 当需要提高系统的安全性时,可以使用外观模式。外观类可以控制客户端访问系统的部分,从而提高系统的安全性。 当需要为客户端提供一个简单的接口时,可以使用外观模式。外观模式可以将系统的复杂性隐藏在一个单独的外观类中,使客户端代码更加简单和易于使用。 4、外观模式的结构 外观模式的结构包括以下几个部分: 外观类(Facade):外观类是外观模式的核心,它提供了一个简单的接口,用于访问系统的一组接口。外观类通常包含一组简单的方法,用于将客户端请求转发给系统的不同部分,并返回结果。 子系统类(Subsystem):子系统类是系统的各个部分,它们实现了系统的各种功能。子系统类可以是一个或多个类,它们之间可能存在依赖关系。 客户端(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 本文由激流原创,首发于CSDN博客,博客主页 https://blog.csdn.net/qq_37967783?spm=1010.2135.3001.5421喜欢的话记得点赞收藏啊

/template/Home/leiyu/PC/Static