Java设计模式中的外观模式详解

 更新时间:2023年02月08日 09:59:50   作者:低调函数  
外观模式为多个复杂的子系统,提供了一个一致的界面,使得调用端只和这个接口发生调用,而无须关系这个子系统内部的细节。本文将通过示例详细为大家讲解一下外观模式,需要的可以参考一下

一 定义

外观(Facade)模式又叫作门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。

二 UML类图

外观模式是为了解决类与类之家的依赖关系的,像spring一样,可以将类和类之间的关系配置到配置文件中,而外观模式就是将他们的关系放在一个Facade类中,降低了类类之间的耦合度,该模式中没有涉及到接口,看下类图:(我们以一个计算机的启动过程为例)

  • 外观类(Facade):为调用端提供统一的调用接口,外观类知道哪些子系统负责处理请求,从而将调用端的请求代理给适当子系统对象
  • 调用者(Client):外观接口的调用者
  • 子系统的集合:指模块或者子系统,处理Facade 对象指派的任务,他是功能的实际提供者

三 代码实例

外观模式可以理解为转换一群接口,客户只要调用一个接口,而不用调用多个接口才能达到目的。比如:在 po

上安装软件的时候经常有一键安装选项(省去选择安装目录、安装的组件等等),还有就是手机的重启功能(把关机和启动合为一个操作)。

外观模式就是解决多个复杂接口带来的使用困难,起到简化用户操作的作用

示意图说明

外观(Facade)角色:为多个子系统对外提供一个共同的接口。

子系统(Sub System)角色:实现系统的部分功能,客户可以通过外观角色访问它。

客户(Client)角色:通过一个外观角色访问各个子系统的功能。

模式的实现

public class CPU {
	public void startup(){
		System.out.println("cpu startup!");
	}
	public void shutdown(){
		System.out.println("cpu shutdown!");
	}
}
public class Memory {
	public void startup(){
		System.out.println("memory startup!");
	}
	public void shutdown(){
		System.out.println("memory shutdown!");
	}
}
public class Disk {
	public void startup(){
		System.out.println("disk startup!");
	}
	public void shutdown(){
		System.out.println("disk shutdown!");
	}
}
public class Computer {
	private CPU cpu;
	private Memory memory;
	private Disk disk;
	public Computer(){
		cpu = new CPU();
		memory = new Memory();
		disk = new Disk();
	}
	public void startup(){
		System.out.println("start the computer!");
		cpu.startup();
		memory.startup();
		disk.startup();
		System.out.println("start computer finished!");
	}
	public void shutdown(){
		System.out.println("begin to close the computer!");
		cpu.shutdown();
		memory.shutdown();
		disk.shutdown();
		System.out.println("computer closed!");
	}
}
//测试
public class User {
	public static void main(String[] args) {
		Computer computer = new Computer();
		computer.startup();
		computer.shutdown();
	}
}

输出结果如下:

start the computer!
cpu startup!
memory startup!
disk startup!
start computer finished!
begin to close the computer!
cpu shutdown!
memory shutdown!
disk shutdown!
computer closed!

如果我们没有Computer类,那么,CPU、Memory、Disk他们之间将会相互持有实例,产生关系,这样会造成严重的依赖,修改一个类,可能会带来其他类的修改,这不是我们想要看到的,有了Computer类,他们之间的关系被放在了Computer类里,这样就起到了解耦的作用,这,就是外观模式!

四 外观模式的优缺点

外观模式的特点:

外观(Facade)模式是“迪米特法则”的典型应用,它有以下主要优点:

  • 降低了子系统与客户端之间的耦合度,使得子系统的变化不会影响调用它的客户类。
  • 对客户屏蔽了子系统组件,减少了客户处理的对象数目,并使得子系统使用起来更加容易。
  • 降低了大型软件系统中的编译依赖性,简化了系统在不同平台之间的移植过程,因为编译一个子系统不会影响其他的子系统,也不会影响外观对象。

外观(Facade)模式的主要缺点如下:

  • 不能很好地限制客户使用子系统类,很容易带来未知风险。
  • 增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”。

五 外观模式的使用场景

通常在以下情况下可以考虑使用外观模式。

  • 对分层结构系统构建时,使用外观模式定义子系统中每层的入口点可以简化子系统之间的依赖关系。
  • 当一个复杂系统的子系统很多时,外观模式可以为系统设计一个简单的接口供外界访问。
  • 当客户端与多个子系统之间存在很大的联系时,引入外观模式可将它们分离,从而提高子系统的独立性和可移植性。

到此这篇关于Java设计模式中的外观模式详解的文章就介绍到这了,更多相关Java外观模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • spring使用RedisTemplate的操作类访问Redis

    spring使用RedisTemplate的操作类访问Redis

    本篇文章主要介绍了spring使用RedisTemplate的操作类访问Redis,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • Java批量操作文件系统的实现示例

    Java批量操作文件系统的实现示例

    文件上传和下载是java web中常见的操作,本文主要介绍了Java批量操作文件系统的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-03-03
  • Java实现新建有返回值的线程的示例详解

    Java实现新建有返回值的线程的示例详解

    本文主要介绍了一个Java多线程的例题,题目是:使用ThreadLocal管理一号和二号线程,分别存入100元,在三号线程中使用利用一号和二号的计算结果来算出账户的实际金额。感兴趣的可以了解一下
    2022-09-09
  • Java强制类型转换的所有规则及说明

    Java强制类型转换的所有规则及说明

    这篇文章主要介绍了Java强制类型转换的所有规则及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • 聊聊Java Double相加出现的怪事

    聊聊Java Double相加出现的怪事

    这篇文章主要介绍了Java Double相加出现的怪事,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Java连接MySQL数据库增删改查的通用方法(推荐)

    Java连接MySQL数据库增删改查的通用方法(推荐)

    下面小编就为大家带来一篇Java连接MySQL数据库增删改查的通用方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • Spring框架学习之Spring @Autowired实现自动装配的代码

    Spring框架学习之Spring @Autowired实现自动装配的代码

    自动装配就是说,你不用手动实现bean之间的组合关系,只要使用了@Autowired注解,程序就会自动的注入这个需要的bean,前提是你的Spring容器有这个bean,这篇文章主要介绍了Spring @Autowired实现自动装配,需要的朋友可以参考下
    2021-12-12
  • Spring整合Junit的使用详解

    Spring整合Junit的使用详解

    这篇文章主要介绍了Spring整合Junit的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • Spring Cloud 部署时使用 Kubernetes 作为注册中心和配置中心的方法

    Spring Cloud 部署时使用 Kubernetes 作为注册中心和配置中

    Spring Cloud Kubernetes提供了使用Kubernete本地服务的Spring Cloud通用接口实现,这篇文章主要介绍了Spring Cloud 部署时如何使用 Kubernetes 作为注册中心和配置中心,需要的朋友可以参考下
    2024-05-05
  • 详解SpringBoot读取resource目录下properties文件的常见方式

    详解SpringBoot读取resource目录下properties文件的常见方式

    这篇文章主要介绍了SpringBoot读取resource目录下properties文件的常见方式,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02

最新评论