java设计模式学习之【外观模式】

news2024/11/28 22:49:49

文章目录

  • 引言
  • 外观模式简介
    • 定义与用途
    • 实现方式
  • 使用场景
  • 优势与劣势
  • 外观模式在Spring中的应用
  • 图形示例
  • 代码地址

引言

软件开发有点像烹饪一道美味佳肴,涉及的材料和步骤可能会让人眼花缭乱。就像在一家大型餐厅厨房中,有许多不同的厨房工具和设备,而每位大厨只需专注于自己的拿手绝活。但是,如果每位大厨都在独立操作,可能就会出现混乱。在这个时候,外观模式就像一位负责整个厨房协调工作的主厨,为客人端上一道道精致的菜肴,而客人无需关心每个食材的具体来源和烹饪过程。

外观模式简介

定义与用途

外观模式又叫门面模式,是一种结构型设计模式,提供了一个统一的接口,以简化底层系统的复杂性。通过定义一个高层接口,客户端与子系统的交互变得更加简单,同时降低了客户端与子系统之间的耦合度。

实现方式

外观模式包含以下主要角色:
外观(Facade): 在外观模式中,外观类是核心。它被客户端调用,知道如何将客户端的请求委派给适当的子系统进行处理。
子系统(Subsystems): 子系统是外观的客户端。它包含了处理外观类指派的任务的具体类。

实现方式相对简单:
创建一个外观类,该类提供了一个简化接口,用于与系统中的一组接口进行交互。
外观类将客户端的请求委派给系统中的各个子系统。

使用场景

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

  1. 简化复杂系统接口: 当一个系统包含许多复杂的子系统时,每个子系统都有自己的接口,而客户端需要与多个子系统交互,这时引入外观模式可以简化这些接口,提供一个更高层次、更简单的接口给客户端使用。
  2. 隐藏子系统的复杂性: 外观模式通过提供一个统一的接口,将子系统的复杂性隐藏起来,使得客户端不必了解子系统的具体实现,从而降低了系统的耦合度。
  3. 系统分层结构: 当系统分为多个层次结构时,每个层次都有自己的接口,而上层需要与多个下层交互。外观模式可以在每个层次中引入外观,提供一个简单的接口供上层使用,降低了层次间的耦合度。
  4. 封装与解耦: 外观模式封装了系统的复杂性,提供了一个简单的接口,使得客户端不必关心系统内部的复杂逻辑。这种封装有助于解耦,使得系统的变化不会影响到客户端。

优势与劣势

优势

  • 简化了客户端与子系统之间的交互,降低了耦合度。
  • 对客户端隐藏了子系统的具体实现,提高了系统的安全性。
  • 外观类的存在使得系统更容易维护和扩展。

劣势

  • 如果系统变得更加复杂,可能需要修改外观类,引入新的问题。
  • 违反了开闭原则,对修改开放,对扩展封闭。

外观模式在Spring中的应用

Spring AOP(面向切面编程): AOP 是 Spring 框架的一个核心模块,用于处理横切关注点,例如事务管理、日志记录等。在AOP中,切面(Aspect)充当了外观角色,它封装了横切关注点的逻辑,并提供了一个简单的接口供客户端使用。通过引入AOP外观,开发者可以在不修改原有业务逻辑的情况下,实现诸如事务、日志等横切关注点。

Spring MVC(Model-View-Controller): 在Spring MVC中,控制器(Controller)充当了外观角色,它负责接收用户请求、调用业务逻辑处理器、选择视图进行展示。控制器封装了复杂的请求处理流程,提供了一个简单的接口供前端控制器(DispatcherServlet)使用。这样,前端控制器就无需关心具体的请求处理细节。

Spring Data(数据访问): Spring Data是Spring框架的一个子项目,用于简化数据访问的开发。在Spring Data中,各种数据访问技术(如JPA、Hibernate、MongoDB等)充当了外观角色,它们封装了底层数据访问细节,提供了一致的数据访问接口供开发者使用。开发者无需关心底层数据访问技术的差异,通过统一的接口即可进行数据操作。

Spring Security(安全框架): Spring Security用于处理应用程序的安全性问题,包括身份验证、授权等。在Spring Security中,安全过滤器链充当了外观角色,它封装了一系列的安全处理步骤,提供了一个简单的接口供开发者配置和使用。通过引入安全过滤器链外观,开发者可以方便地实现各种安全功能,而无需深入了解每个安全处理步骤的实现。

Spring Integration(集成框架): Spring Integration是Spring框架的一个扩展模块,用于处理各种不同系统之间的集成问题。在Spring Integration中,集成通道充当了外观角色,它封装了消息通道、消息处理器等组件,提供了一个简单的接口供开发者使用。通过引入集成通道外观,开发者可以更容易地实现系统集成,而无需关心底层的集成细节。

图形示例

在这里插入图片描述
步骤 1: 创建图形一个接口。

public interface Shape {
    void draw();
}

步骤 2: 创建实现相同接口的具体类。

public class Rectangle implements Shape {

    @Override
    public void draw() {
        System.out.println("图形:矩形");
    }

}
public class Circle implements Shape{

    @Override
    public void draw() {
        System.out.println("图形:圆形");
    }

}

步骤 3: 创建外观类

public class ShapeMaker {

    private Shape circle;
    private Shape rectangle;
    private Shape square;

    public ShapeMaker() {
        circle = new Circle();
        rectangle = new Rectangle();
        square = new Square();
    }

    public void drawCircle(){
        circle.draw();
    }

    public void drawRectangle(){
        rectangle.draw();
    }

    public void drawSquare(){
        square.draw();
    }

}

步骤 4: 使用外观类绘制各种类型的形状。

public class FacadePatternDemo {
    public static void main(String[] args) {
        ShapeMaker shapeMaker = new ShapeMaker();

        shapeMaker.drawCircle();
        shapeMaker.drawRectangle();
        shapeMaker.drawSquare();
    }
}

在这里插入图片描述
在这个示例中,我们有一个 Shape 接口,以及实现该接口的具体形状类(Rectangle、Square、Circle)。然后,我们创建了一个外观类 ShapeMaker,该类封装了对这些具体形状类的调用。最后,在 FacadePatternDemo 类中,我们使用 ShapeMaker 类来绘制各种类型的形状。

这种设计模式的优势在于客户端无需了解每个具体形状类的实现细节,而是通过简单的接口调用来实现相应的功能。外观模式在提供清晰简洁的API的同时,也降低了客户端与子系统之间的耦合度。

代码地址

23种设计模式相关代码后续会逐步提交到github上,方便学习,欢迎指点:
代码地址
https://github.com/RuofeiSun/lf-23Pattern

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1318429.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PVE系列-防火墙的免费安静之旅IPfire

Ventoy一款引导盘可以引导各种启动盘安装盘的工具https://www.ventoy.net/cn/index.html 在它的兼容iso的列表 中发现了Ipfirehttps://wiki.ipfire.org/ ,本来用着openwrt也挺好,忍不住的虚拟机尝了尝鲜,发现的功能有2, 安全吧&a…

Windows安装Elasticsearch并结合内网穿透实现公网远程访问

Windows安装Elasticsearch并结合内网穿透实现公网远程访问 系统环境1. Windows 安装Elasticsearch2. 本地访问Elasticsearch3. Windows 安装 Cpolar4. 创建Elasticsearch公网访问地址5. 远程访问Elasticsearch6. 设置固定二级子域名 Elasticsearch是一个基于Lucene库的分布式搜…

Lumerical 技巧------Plot in New Window

Lumerical 技巧------Plot in New Window 简介正文 简介 当我们在计算模式分布后想要观察模式对应的图像,为了清晰地观察到一些细节,我们可以通过点击图像绘制窗口的 Plot in New Window 按键来实现。 正文 默认模式绘制图像如下: 窗口很…

高质量C/C++代码心得

写出高质量的C/C代码是一个涉及多方面的任务,它要求程序员不仅具备扎实的语言基础,还需要掌握一系列的软件设计和开发原则。下面将详细介绍如何写出高质量的C/C代码,并通过10个例子进行具体阐述。 一、编码规范 编写高质量的代码&#xff…

Learning Semantic-Aware Knowledge Guidance forLow-Light Image Enhancement

微光图像增强(LLIE)研究如何提高照明并生成正常光图像。现有的大多数方法都是通过全局和统一的方式来改善低光图像,而不考虑不同区域的语义信息。如果没有语义先验,网络可能很容易偏离区域的原始颜色。为了解决这个问题&#xff0…

Linux 定时删除过期文件

需求说明 每日凌晨0点定时删除/temp目录下的所有一个月未被访问的文件。 脚本实现 linux 终端输入crontab -e,添加定时任务脚本命令 [rootlocalhost ~]# crontab -e在文件末尾追加 0 0 * * * find /temp -atime 30 -exec rm -rf {} \;参数说明 命令格式&#…

计算机网络(1):开始

计算机网络(1):开始 计算机网络在信息时代中的作用 21世纪的一些重要特征就是数字化、网络化和信息化,是一个以网络为核心的信息时代。要实现信息化就必须依靠完善的网络,因为网络可以非常迅速地传递信息。因此网络现…

BAQ压缩原理

什么是BAQ? BAQ——Block Adaptive Quantization,块自适应量化 BAQ是一种数据压缩算法。 谁提出了BAQ压缩? BAQ压缩原理是由美国NASA JPL的R. Kwok和W.T.K. Johnson在1989年提出的。第一次被用于美国NASA的“麦哲伦金星探测”任务中。 BAQ压缩的目的是什么? 上世纪后半…

使用Python进行文本处理:深入探索文本分析和操作

更多Python学习内容:ipengtao.com 大家好,我是彭涛,今天为大家分享 使用Python进行文本处理:深入探索文本分析和操作,全文3800字,阅读大约12分钟。 文本处理是数据科学和自然语言处理中的关键任务之一。Pyt…

【Mode Management】ComM详细介绍

目录 1. Introduction and functional overview 2.Dependencies to other modules 3.Functional specification 3.1 Partial Network Cluster Management 3.2 ComM channel state machine 3.2.1 Behaviour in state COMM_NO_COMMUNICATION 3.2.1.1 COMM_NO_COM_NO_PENDI…

【Qt QML入门】TextInput

TextInput:单行文本输入框。 TextInput除了光标和文本外,默认没有边框等效果。 import QtQuick import QtQuick.Window import QtQuick.ControlsWindow {id: winwidth: 800height: 600visible: truetitle: qsTr("Hello World")//单行文本输…

typescript使用解构传参

看下面这个函数 interface Student {id: number;name: string;class: string;sex: string;}function matriculation(student: Student) {//...}我们要调用它,就需要传递一个实现了Student约束的对象进去 interface Student {id: number;name: string;class: string;sex: string…

【算法】算法题-20231211

这里写目录标题 一、387. 字符串中的第一个唯一字符二、1189. “气球” 的最大数量三、1221. 分割平衡字符串 一、387. 字符串中的第一个唯一字符 简单 给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回…

uniapp实现地图电子围栏功能

该功能使用uniapp中内置组件map实现 效果图预览&#xff1a; 实现过程&#xff1a; 1.文档&#xff1a; 2.代码&#xff1a; <template><view><map :style"width: 100%; height:screenHeight" :latitude"latitude" :longitude"longit…

lightdb 23.4 支持pivot行转列

前言 lightdb-x从23.4版本支持pivot行转列功能&#xff1b;先了解oracle支持行转列功能&#xff1a; 语法如下&#xff1a; oracle描述如下&#xff1a; Oracle 11g introduced the new PIVOT clause that allows you to write cross-tabulation queries which transpose …

【数据结构】复习题(一)

一、选择题 1.组成数据的基本单位是()。 A. 数据项 B.数据类型 C.数据元素 D.数据变量 2.设数据结构A{D,R},其中D&#xff5b;1,2,3,4},R{r},r{<1,2>,<2,3>,< 3,4>,<4,1>}&#xff0c;则数据结构A是()。 A.线性结构 B.树型结构 C.图型结构 D.集合 3.…

DC电源模块的设计与制造技术创新

BOSHIDA DC电源模块的设计与制造技术创新 DC电源模块的设计与制造技术创新主要涉及以下几个方面&#xff1a; 1. 高效率设计&#xff1a;传统的DC电源模块存在能量转换损耗较大的问题&#xff0c;技术创新可通过采用高效率的电路拓扑结构、使用高性能的功率开关器件和优化控制…

【深度学习目标检测】四、基于深度学习的抽烟识别(python,yolov8)

YOLOv8是一种物体检测算法&#xff0c;是YOLO系列算法的最新版本。 YOLO&#xff08;You Only Look Once&#xff09;是一种实时物体检测算法&#xff0c;其优势在于快速且准确的检测结果。YOLOv8在之前的版本基础上进行了一系列改进和优化&#xff0c;提高了检测速度和准确性。…

人生感悟 | 当前经济形势,给25~35岁的年轻人一点建议

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 这两年经济情况怎么样呢&#xff1f;相信大家都有自己的感觉。 且不说网上看到的“裁员裁到大动脉”“设计院欠薪”等各种新闻。 说自己和家人的亲身经历吧&#xff0c;这两年经历了被拖欠工资、公司缩编、换工作、公…

python分析数据出现Text input context does not respond to _valueForTIProperty错误

一开始运行脚本还是不报错的&#xff0c;脚本内容部分如下&#xff1a; 出现了如下的效果图&#xff1a; 后面隔了几天再次运行居然报错了&#xff0c;如下图所示&#xff0c;但是也没有更改代码啊。后来发现原来是输入法导致的&#xff0c;把输入法切换成英文状态就不报错啦。…