11、设计模式之外观模式

外观模式

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

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

介绍

意图: 为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

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

何时使用:

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

如何解决: 客户端不与系统耦合,外观类与系统耦合。

关键代码: 在客户端和复杂系统之间再加一层,这一层将调用顺序、依赖关系等处理好。

应用实例:

  • 1、去医院看病,可能要去挂号、门诊、划价、取药,让患者或患者家属觉得很复杂,如果有提供接待人员,只让接待人员来处理,就很方便。
  • 2、JAVA 的三层开发模式。

优点:

  1. 减少系统相互依赖。
  2. 提高灵活性。
  3. 提高了安全性。

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

使用场景:

  1. 为复杂的模块或子系统提供外界访问的模块。
  2. 子系统相对独立。

注意事项:

  1. 在层次化结构中,可以使用外观模式定义系统中每一层的入口。
  2. 预防低水平人员带来的风险。

外观模式涉及以下核心角色:

外观(Facade):

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

子系统(Subsystem):

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

客户端(Client):

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

代码实现

以基金经理管理股票和国债为例。既可以单独购买、售卖股票;也可以单独购买、售卖国债;也可以一起购买、售卖股票和国债。

定义金融产品

/*** 金融产品*/
public interface FinanceProduct {void buy();void sell();
}

定义国债/政府债

/*** 国债/政府债*/
public abstract class GovernmentLoan implements FinanceProduct{public abstract String getName();@Overridepublic void buy() {System.out.println("购买国债:"+getName());}@Overridepublic void sell() {System.out.println("售卖国债:"+getName());}
}

定义股票

/*** 股票*/
public abstract class Stock implements FinanceProduct{public abstract String getName();@Overridepublic void buy() {System.out.println("购买股票:"+getName());}@Overridepublic void sell() {System.out.println("售卖股票:"+getName());}
}

定义门面

public class FinanceBuyAndSellFacade {private Stock stock;private GovernmentLoan governmentLoan;public FinanceBuyAndSellFacade(){this.governmentLoan = new GovernmentLoan() {@Overridepublic String getName() {return "浙江债";}};this.stock = new Stock() {@Overridepublic String getName() {return "腾讯";}};}public void buyStockAndGovernmentLoan(){stock.buy();governmentLoan.buy();}public void sellStockAndGovernmentLoan(){stock.sell();governmentLoan.sell();}public void buyStock(){stock.buy();}public void sellStock(){stock.sell();}public void buyGovernmentLoan(){governmentLoan.buy();}public void sellGovernmentLoan(){governmentLoan.sell();}
}

客户端

public class Client {public static void main(String[] args) {FinanceBuyAndSellFacade financeBuyAndSellFacade = new FinanceBuyAndSellFacade();financeBuyAndSellFacade.buyStockAndGovernmentLoan();financeBuyAndSellFacade.sellStockAndGovernmentLoan();financeBuyAndSellFacade.buyStock();financeBuyAndSellFacade.sellStock();financeBuyAndSellFacade.buyGovernmentLoan();financeBuyAndSellFacade.sellGovernmentLoan();}
}

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

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

相关文章

LiveGBS流媒体平台GB/T28181用户手册-版本信息:查看机器码、切换查看流媒体服务

LiveGBS流媒体平台GB/T28181用户手册--版本信息:查看机器码、切换查看流媒体服务 1、版本信息1.1、查看机器码1.2、多个流媒体服务1.3、提交激活 2、搭建GB28181视频直播平台 1、版本信息 版本信息页面,可以查看到信令服务 流媒体服务相关信息,包含硬件…

免费分享一套微信小程序旅游推荐(智慧旅游)系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】,帅呆了~~

大家好,我是java1234_小锋老师,看到一个不错的微信小程序旅游推荐(智慧旅游)系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序旅游推荐(智慧旅游)系统(SpringBoot后端Vue管理端) Java毕业设计…

小程序丨数据功能如何使用

查询发布完成后,如发现信息有误或想要修改信息,老师可以使用数据功能在线修改已发布的查询内容。 数据功能包含导出、添加、编辑、更多操作,下面来教大家如何使用吧。 📌使用教程 数据功能主要用于在线修改已发布的查询内容&#…

Day2 数组小结

数组的性质 1、数组的小标从0开始且地址连续 2、数组定位元素的效率非常高,几乎是O(n)的时间复杂度,因此查找很快 3、因为内存连续,因此进行删除或者添加的话,需要移动后面的元素 4、二维数组空间并不是连续的,如{{1,…

【LGR-187-Div.4】洛谷入门赛 #23

原题链接:题目列表 - 洛谷 B3970~B3977为A~H题 目录 A. 数字取模 B. 闰年 C. 二进制 D. 小 S 大战小 Q E. 放行李 F. 最大的和 G. 交题解 H. 更好的交换 A. 数字取模 直接模拟即可。将数字x的每一位都开一个变量存起来,再分别让每个变量对k取…

C语言 | Leetcode C语言题解之第108题将有序数组转换为二叉搜索树

题目: 题解: struct TreeNode* helper(int* nums, int left, int right) {if (left > right) {return NULL;}// 选择任意一个中间位置数字作为根节点int mid (left right rand() % 2) / 2;struct TreeNode* root (struct TreeNode*)malloc(sizeo…

ElasticSearch IK分词器的安装、词典扩展与停用

🏷️个人主页:牵着猫散步的鼠鼠 🏷️系列专栏:云原生与服务部署-专栏 🏷️个人学习笔记,若有缺误,欢迎评论区指正 目录 ​编辑 1. 前言 2. IK分词器安装 3. IK分词器词典扩展与停用 4. 总…

汽车整车检测的原由(北重试验平台制造厂家)

汽车整车检测是指对整车系统和构造各部分的性能、可靠性、安全性等方面进行全面检查和评估的过程。它是在汽车生产制造和销售使用环节中,为了保障驾驶安全和质量而必不可少的一项检测和评估工作。 1. 提升行车安全 汽车整车检测能够全面评估车辆的性能和安全性&…

音视频-常用的分析工具介绍-连续补充

目录 1:Audacity 2:MediaInfo 3:MP4Box 4:hexinator 5:Adobe Audition 6:VideoEye 7:YUVplayer (YUV/RGB播放器) 在做音视频分析时,经常用到各种分析工…

【无标题】思科交换路由中路由引入实验指南

路由引入是网络设计中的一个重要概念,它允许不同路由协议之间的路由信息交换。在思科网络设备中,路由引入可以增强网络的连通性和效率。本文将介绍路由引入的基本概念,并通过一个实验来演示如何在思科路由器中实现路由引入。 ## 路由引入的基…

头歌05-子集树实验-01背包

""" 题目:有n个重量分别为w{w_1,w_2,…,w_n}的物品,他们的价值分别为v{v_1,v_2,…,v_n},给定一个容量为G的背包。 设计从这些物品中选取一部分物品放入该背包的方案,每个物品要么选中要么不选中,要求选…

读书笔记整理

1.对天才而言,任何努力都如做游戏般容易和有趣,兴趣是发展的原动力。从这个角度来看,通过普通人的劳动是无法创造天才的。 2.让孩子理解语法是很困难的。苦背不如练才是行之有效的办法。孩子们永远是故事迷,在教孩子们外语时&…

sqlserver查看正在执行的语句,锁,内存,cpu占用多等

sqlserver查看正在执行的语句 SELECT [Spid] session_Id ,ecid ,[Database] DB_NAME(sp.dbid) ,[User] nt_username ,[Status] er.STATUS ,[Wait] wait_type ,[Individual Query] SUBSTRING(qt.TEXT, er.statement_start_offset / 2, ( CASE WHEN er.statement_end_offs…

【有手就行】使用你自己的声音做语音合成,CPU都能跑,亲测有效

此文介绍在百度飞桨上一个公开的案例,亲测有效。 厌倦了前篇一律的TTS音色了吗?打开短视频听来听去就是那几个声音,快来试试使用你自己的声音来做语音合成吧!本教程非常简单,只需要你能够上传自己的音频数据就可以(建议…

OpenLayers中实现对ImageStatic图层的扩展以支持平铺WrapX功能

地图平铺技术概述 地图平铺(Tiling)是一种将大尺寸地图数据分割成小块(瓦片)的技术,这在地图服务中非常常见。它使得地图数据能高效加载和展示,尤其适合网络环境。通过仅加载当前视图窗口所需的地图瓦片&a…

Spring Boot Web 开发:MyBatis、数据库连接池、环境配置与 Lombok 全面解析

推荐一个AI网站,免费使用豆包AI模型,快去白嫖👉海鲸AI 1.0 MyBatis 概述 MyBatis 是一个优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 可以帮助我们将数据库操作抽象出来,使得我们的代码更加简洁…

SERVER ——查询(二)

目录 5. top 6. null 7. order by 8. 模糊查询: 9. 聚合函数 5. top top查询:查询表的前几行;下面是代码演示: --top(前面的几个记录) select top 2 * from emp; --查询表的前两列 select top 20 percent *…

Altium Designer 软件下载与安装

AD学习之旅(1)— Altium Designer 20 软件下载与安装 一、前言 本次软件安装参考自:Altium Designer 20 AD20软件安装详解教程 凡亿 Altium公司推荐的系统配置如下: 64位操作系统,不支持32位系统;Windows …

MoonDream2微调指南【最小VLM】

在本指南中,我们将探讨如何使用计算机视觉数据集对完全开源的小型视觉语言模型 Moondream2 进行微调,以计数项目(这是 GPT-4V 一直表现不一致的任务),并以一种可以依赖输出用于生产应用程序的方式进行微调。 视觉语言…

FFmpeg操作命令 - 精简版

PS:(因为我只需要简单的操作,所以我整理出了这份笔记) 原网址:30分钟带你入门,20个 FFmpeg操作命令,包你学会 - 知乎 大佬零声Github整理库整理的笔记非常的全面,想看完整版去上面…