设计模式篇---外观模式

news/2024/11/13 4:00:46/

文章目录

    • 概念
    • 结构
    • 实例
    • 总结

概念

外观模式:为子系统中的一组接口提供一个统一的入口。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
外观模式引入了一个新的外观类,它为多个业务类的调用提供了一个统一的入口。主要优点是对客户端屏蔽了子系统组件,减少了客户端所需处理的对象数量。
举个例子,比如查询人员的权限,客户端可以调用外观类的方法,外观类中封装一个方法,方法里面依次调用两个实现类,该方法先是示查询出人员的角色,然后根据查出来的角色去查询角色的权限。将客户端与实现类进行解耦,就不用客户端调两次了,客户端只需要调用外观类一次即可。

结构

在这里插入图片描述

Facade(外观角色):外观角色中知道一个或多个子系统的功能和责任。它用来将客户端发来的请求委派到相应的子系统,传递给乡音的子系统对象处理。
SubSystem(子系统角色):系统中可以有一个或多个子系统角色,每一个子系统都可以被客户端直接调用,或者被外观角色调用。子系统并不知道外观的存在,对于子系统而言,外观角色仅仅是另外一个客户端而已。

实例

比如我们上班回家后,要做的事情依次是开门、开灯、打开电视,现在用外观模式来完成这个过程。
在这里插入图片描述

Door 类

public class Door {public void openDoor(){System.out.println("门开了");}}

Lamp类

public class Lamp {public void turnOnLight(){System.out.println("灯开了");}
}

TV类

public class TV {public void turnOnTv() {System.out.println("电视开了");}}

Facade类

public class Facade {private TV tv = new TV();private Door door = new Door();private Lamp lamp = new Lamp();public void open() {tv.turnOnTv();door.openDoor();lamp.turnOnLight();}}

Client 端

public class Client {public static void main(String[] args) {Facade facade = new Facade();facade.open();}
}

如果不用外观模式,则客户端的调用方式是这样的:

public class Client {public static void main(String[] args) {Door door = new Door();Lamp lamp = new Lamp();TV tv = new TV();door.openDoor();lamp.turnOnLight();tv.turnOnTv();}
}

上面是客户端直接调用业务实现类,需要依赖三个子系统,而使用外观模式,则只需要关联一个外观类,降低了系统的耦合度。

总结

优点:
1、它对客户端屏蔽了子系统,减少了客户端所需处理的对象数目,客户端代码变得很简单。
2、它实现了子系统和客户端的松耦合关系,使得子系统的变化不会影响到客户端,只需要更改外观类即可。
缺点:
1、违背开闭原则,有新的子系统加入需要修改外观类。

外观模式和建造者模式的思路很相似。外观模式是将复杂的子系统操作给外观类,客户端直接调用外观类即可;建造者模式是将复杂的操作给指挥者,指挥者内部指挥建造者创建,客户端直接关联指挥者即可。


http://www.ppmy.cn/news/1234401.html

相关文章

【Rxjava详解】(二) 操作符的妙用

文章目录 接口变化操作符mapflatmapdebouncethrottleFirst()takeconcat RxJava 是一个基于 观察者模式的异步编程库,它提供了丰富的操作符来处理和转换数据流。 操作符是 RxJava 的核心组成部分,它们提供了一种灵活、可组合的方式来处理数据流&#xf…

kafka操作的一些坑

1.如果Offset Explorer能够检测到kafka中的数据,但是自己的kafka无法读取到 这个问题主要是由于kafka中的信息已经被消费掉了造成的 consumer.commitAsync();这里如果已经消费掉了kafka的信息,那么已经被消费掉的kafka数据就不会被再读取掉&#xff0c…

JVM 之 字节码指令

目录 一. 前言 二. 指令集 2.1. 支持的数据类型 2.2. 指令分类 三. 指令手册 3.1. 操作数栈 3.2. 运算与转换 3.3. 条件转移 3.4. 类与数组 3.5. 调度与返回加 finally 3.6. 指令手册汇总 3.7. 示例 一. 前言 字节码指令集的特点是数据量短小精干,便于传…

@Scheduled注解 定时任务讲解

用于在Java Spring框架中定时执行特定任务的注解 Scheduled,它能够指定方法在特定时间间隔或特定时间点执行。默认参数是cron,cron参数被用来定义一个Cron表达式,它代表了任务执行的时间规则 参数如下 Cron 这是是一种时间表达式&#xff…

ARM 汇编基础

我们在学习 STM32 的时候几乎没有用到过汇编,可能在学习 UCOS 、 FreeRTOS 等 RTOS 类操作系统移植的时候可能会接触到一点汇编。但是我们在进行嵌入式 Linux 开发的时候是绝 对要掌握基本的 ARM 汇编,因为 Cortex-A 芯片一上电 SP 指针还…

规划类3d全景线上云展馆帮助企业轻松拓展海外市场

科技3D线上云展馆作为一种基于VR虚拟现实和互联网技术的新一代展览平台。可以在线上虚拟空间中模拟真实的展馆,让观众无需亲自到场,即可获得沉浸式的参观体验。通过这个展馆,您可以充分、全面、立体展示您的产品、服务以及各种创意作品&#…

网络和Linux网络_4(应用层)序列化和反序列化(网络计算器)

目录 1. 重新理解协议 2. 网络版本计算器 2.1 前期封装 Log.hpp sock.hpp TcpServer.hpp 第一次测试(链接) 2.2 计算器实现 第二次测试(序列化和反序列化) 第三次测试(客户端字节流) CalServer.cc CalClient.cc 3. 守护进程 3.1 守护进程和前后台进程 3.1 变成…

转移表达式:<![CDATA[ ]]>

你是否遇到过&#xff1a;在mybatis 时我们sql是写在xml 映射文件中&#xff0c;如果写的sql中有一些特殊的字符的话&#xff0c;在解析xml文件的时候会被转义&#xff0c;但我们不希望他被转义&#xff0c;所以我们要使用<![CDATA[ ]]>来解决。 <![CDATA[ ]]> …