博主介绍: ✌博主从事应用安全和大数据领域,有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
💕💕喜欢的话记得点赞收藏啊