Java特性之设计模式【外观模式】

一、外观模式

概述

外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性

这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用

主要解决

降低访问复杂系统的内部子系统时的复杂度,简化客户端之间的接口

何时使用

1、客户端不需要知道系统内部的复杂联系,整个系统只需提供一个"接待员"即可

2、定义系统的入口

优缺点

优点:

  • 减少系统相互依赖
  • 提高灵活性
  • 提高了安全性

缺点:

  • 不符合开闭原则,如果要改东西很麻烦,继承重写都不合适

1. 各个角色介绍

1.1 外观(Facade)

  • 提供一个简化的接口,封装了系统的复杂性。外观模式的客户端通过与外观对象交互,而无需直接与系统的各个组件打交道

1.2 子系统(Subsystem)

  • 由多个相互关联的类组成,负责系统的具体功能。外观对象通过调用这些子系统来完成客户端的请求

1.3 客户端(Client)

  • 使用外观对象来与系统交互,而不需要了解系统内部的具体实现

2. UML图

​ 我们将创建一个 Shape 接口和实现了 Shape 接口的实体类。下一步是定义一个外观类 ShapeMakerShapeMaker 类使用实体类来代表用户对这些类的调用。Main 类使用 ShapeMaker 类来显示结果

在这里插入图片描述

3. 具体例子和代码

角色分配

  • Shape:形状接口

    • Rectangle:实现形状接口的长方形类
    • Circle:实现形状接口的圆形类
    • Square:实现形状接口的正方形
  • ShapeMaker:外观类

3.1 抽象组件及其实现类

  • Shape
package com.vinjcent.prototype.decorator;/*** @author vinjcent* @description 形状接口* @since 2024/3/15 16:23*/
public interface Shape {/*** 形状绘制动作*/void draw();}
  • Rectangle
package com.vinjcent.prototype.facade;/*** @author vinjcent* @description 长方形* @since 2024/3/20 16:32*/
public class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("Rectangle::draw()");}}
  • Circle
package com.vinjcent.prototype.facade;/*** @author vinjcent* @description 圆形* @since 2024/3/20 16:36*/
public class Circle implements Shape {@Overridepublic void draw() {System.out.println("Circle::draw()");}}
  • Square
package com.vinjcent.prototype.facade;/*** @author vinjcent* @description 正方形* @since 2024/3/20 16:34*/
public class Square implements Shape {@Overridepublic void draw() {System.out.println("Square::draw()");}}

3.2 外观类

  • ShapeMaker
package com.vinjcent.prototype.facade;import io.swagger.annotations.ApiModelProperty;/*** @author vinjcent* @description 外观类* @since 2024/3/20 16:35*/
public class ShapeMaker {@ApiModelProperty("圆形")private final Shape circle;@ApiModelProperty("长方形")private final Shape rectangle;@ApiModelProperty("正方形")private final 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();}}

3.3 测试主函数

package com.vinjcent.prototype.facade;/*** @author vinjcent* @description 外观模式* @since 2024/3/20 16:38*/
public class Main {public static void main(String[] args) {// 创建一个"外观类"ShapeMaker shapeMaker = new ShapeMaker();// 绘制"圆形"shapeMaker.drawCircle();// 绘制"长方形"shapeMaker.drawRectangle();// 绘制"正方形"shapeMaker.drawSquare();}}
  • 测试结果

在这里插入图片描述

4. 使用场景

  • 为复杂的模块或子系统提供外界访问的模块
  • 子系统相对独立
  • 预防低水平人员带来的风险

在这里插入图片描述

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

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

相关文章

漏洞挖掘 SSRF 一次很菜的SSRF低危小通杀

前言 一转眼貌似很长时间都没更新博客了,甚至连标题的大小和格式都有点忘了,今后应该尽量保持每周更新一次,主要是平常上课太忙了,在学校还总是不定时会刷新一些烂事,就耽误了很多时间。这篇文章用于记载我最近的一次…

PixArt-β:Fast and controllable image generation with latent consistency models

PixArt α to Σ: All about Efficient Diffusion Models - 知乎前言自年初Sora和Stable Diffusion 3推出以来,笔者就开始关注基于Diffusion Transformer的工作。在我的往期文章《 Diffusion Transformer Family:关于Sora和Stable Diffusion 3你需要知道…

原子操作和竞争条件

所有系统调用都是以原子操作方式执行的。之所以这么说,是指内核保证了某系统调用中的所有步骤会作为独立操作而一次性加以执行,其间不会为其他进程或线程所中断。原子性是某些操作得以圆满成功的关键所在。特别是它规避了竞争状态(race condi…

arm内核驱动-中断

先介绍个东西 ctags 这个工具可以像keil一样在工程里查找跳转,帮我们找到我们想要的东西。 安装教程可以找到,这里只讲怎么用。 在工程目录(包含所有你会用到的头文件等)下,先加载这个命令,可能要等待…

repl_backlog原理

2.2.3.repl_backlog原理 master怎么知道slave与自己的数据差异在哪里呢? 这就要说到全量同步时的repl_baklog文件了。 这个文件是一个固定大小的数组,只不过数组是环形,也就是说角标到达数组末尾后,会再次从0开始读写,这样数组…

vue快速入门(十三)v-model的使用

注释很详细&#xff0c;直接上代码 上一篇 新增内容 数据双向绑定数据清空方法 源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-…

inline内联函数速解

inline内联的效果 #include <stdio.h>inline int max(int x, int y) {return x > y ? x : y; }int main() {int a 5, b 10;int m max(a, b);printf("The maximum value is %d\n", m);return 0; }当编译器决定将max函数内联时&#xff0c;它会在编译时期…

vue数据检测原理

前言 Vue中的数据监听离不开Object.defineProperty()方法的使用&#xff0c;在了解数据监测原理之前&#xff0c;建议先掌握defineProperty的用法。 目标 1 数据监测问题 2 数据监测原理 3 如何实现数组更新 1 遇到的问题 数组更新问题 <button click"updatePeople&q…

ABAP-CPI-Odata POST-create_deep_entity 多层嵌套的处理及CPI端的调用

该文章演示怎么在OData里,创建一个多套多的请求结构,传入数据处理后,返回多层级的处理结果;以及如何在CPI里写groovy脚本,去解析它;最后如何用postman模拟外围系统,调用CPI这个接口,从而去调用Odata接口 假如想用SAP Odata去实现传入多层级的数据,进行创建或者根据传入…

【pb_ds】2024.4.11

2024.4.11 【虚怀若谷&#xff0c;戒骄戒躁。】 Thursday 三月初三 <theme oi-“language”> 这个好东西叫pb_ds!!! #include<bits/extc.h> using namespace __gnu_cxx; using namespace __gnu_pbds;堆 操作/数据结构配对堆二叉堆左偏树二项堆斐波那契堆代码p…

libVLC 提取视频帧使用QWidget渲染

在前面的文章中&#xff0c;我们使用libvlc_media_player_set_hwnd设置了视频的显示的窗口。 libvlc_media_player_set_hwnd(vlc_mediaPlayer, (void *)ui.widgetShow->winId()); 如果我们想要提取每一帧数据&#xff0c;将数据渲染到QWidget上&#xff0c;该如何操作呢&a…

java八股——消息队列MQ

上一篇传送门&#xff1a;点我 目前只学习了RabbitMQ&#xff0c;后续学习了其他MQ后会继续补充。 MQ有了解过吗&#xff1f;说说什么是MQ&#xff1f; MQ是Message Queue的缩写&#xff0c;也就是消息队列的意思。它是一种应用程序对应用程序的通信方法&#xff0c;使得应用…

爬虫之获取人人车网站中车辆的信息

爬虫之获取人人车网站中车辆的信息 import base64 import timeimport pymysql from fontTools.ttLib import TTFont from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.edge.options import Options import recar_id_list…

后端项目部署教程

一、打包jar包 lyamanoblog-server-0.0.1.jar ps:运行时可能会提醒不能有大写字母&#xff0c;所以用的都是小写字母 二、编写Dockerfile文件 FROM java:8 VOLUME /tmp ADD lyamanoblog-server-0.0.1.jarblog.jar ENTRYPOINT ["java","-Djava.securit…

Codeforces Round 142 (Div. 2) - B. T-primes (数论)

我们知道&#xff0c;质数是具有两个不同正除数的正整数。同样&#xff0c;我们把正整数 t t t 称为质数。Т-质数&#xff0c;如果 t t t 恰好有三个不同的正除数。 给你一个由 n 个正整数组成的数组。请判断其中每个整数是否为 Т-prime。 输入 第一行包含一个正整数 n …

八次危机笔记

文章目录 前言一、思维导图危机一危机二危机三危机四危机五危机六危机七危机八 前言 重塑三观&#xff0c;致敬温老。一个有良心的学者&#xff01;&#xff01;&#xff01; 一、思维导图 危机一 危机二 危机三 危机四 危机五 危机六 危机七 危机八 ☆

2023年上半年信息系统项目管理师——综合知识真题与答案解释(1)

2023年上半年信息系统项目管理师 ——综合知识真题与答案解释(1) 零、00时光宝盒 1009 Rejections 1009 拒绝 Once, there was an old man, who was broke, living in a tiny house and owned a beat-up car. 有一次&#xff0c;有一个老人&#xff0c;他破产了&#…

【LeetCode刷题笔记】LeetCode 1365.有多少小于当前数字的数字

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 更多算法知识专栏&#xff1a;算法分析&#x1f525; 给大家跳段街舞感谢…

curaengine编译源码之libarcus编译记录

libArcus的编译&#xff08;成功安装&#xff09; This library contains C code and Python3 bindings for creating a socket in a thread and using this socket to send and receive messages based on the Protocol Buffers library. It is designed to facilitate the c…

从文字到思维:呆马GPT在人工智能领域的创新之旅

引言 生成式预训练变换器&#xff08;Generative Pre-trained Transformer&#xff0c;简称GPT&#xff09;领域是人工智能技术中的一大革新。自OpenAI推出第一代GPT以来&#xff0c;该技术经历了多代发展&#xff0c;不断提升模型的规模、复杂度和智能化程度。GPT模型通过在大…