设计模式使用场景实现示例及优缺点(结构型模式——代理模式、外观模式)

结构型模式

代理模式(Proxy Pattern)

代理模式(Proxy Pattern)是一种结构型设计模式,它通过引入一个代理对象来控制对另一个对象的访问。这个代理对象可以为被代理的对象提供额外的功能,例如访问控制、延迟初始化、日志记录、或网络访问等。

适用场景

  1. 远程代理

    • 为一个对象在不同的地址空间提供局部代表。
  2. 虚拟代理

    • 根据需要创建开销很大的对象。
  3. 保护代理

    • 控制对原始对象的访问。
  4. 智能指引

    • 在访问对象时执行一些附加操作,例如计数操作或引用检测。

实现示例(Java)

以下是一个简单的代理模式的实现示例,展示如何通过代理对象控制对实际对象的访问。

1. 定义主题接口
public interface Subject {void request();
}
  • 说明Subject 接口定义了一个 request 方法,这是实际对象和代理对象都需要实现的方法。
2. 定义真实主题类(RealSubject)
public class RealSubject implements Subject {public void request() {System.out.println("RealSubject: Handling request.");}
}
  • 说明RealSubject 类实现了 Subject 接口的 request 方法,表示真实处理请求的类。
3. 定义代理类(Proxy)
public class Proxy implements Subject {private RealSubject realSubject;public Proxy(RealSubject realSubject) {this.realSubject = realSubject;}public void request() {if (this.checkAccess()) {this.realSubject.request();this.logAccess();}}private boolean checkAccess() {// 检查访问权限System.out.println("Proxy: Checking access prior to firing a real request.");return true;}private void logAccess() {// 记录请求日志System.out.println("Proxy: Logging the time of request.");}
}
  • 说明
    • Proxy 类实现了 Subject 接口,并持有一个 RealSubject 对象。
    • request 方法中,代理类先检查访问权限,再调用真实对象的 request 方法,最后记录请求日志。
4. 客户端代码
public class Client {public static void main(String[] args) {RealSubject realSubject = new RealSubject();Proxy proxy = new Proxy(realSubject);proxy.request();}
}
  • 说明
    • Client 类创建了 RealSubjectProxy 对象,通过 Proxy 对象调用 request 方法,从而控制对 RealSubject 的访问。

优点

  1. 隔离性

    • 代理模式可以作为调用者和实际对象之间的中介,降低系统组件之间的耦合度,增强对象间的隔离性。
  2. 安全性

    • 通过代理可以控制对实际对象的访问,实现安全检查以及深度验证。
  3. 扩展性

    • 代理模式在不修改具体对象代码的情况下,可以灵活地增加功能。
  4. 智能化

    • 可以在不改变服务对象接口的前提下,实施一些附加操作,如延迟初始化和访问日志等。

缺点

  1. 代码复杂性

    • 引入代理也意味着增加了系统的复杂性,可能会引入新的类和接口,增加了代码的理解和维护成本。
  2. 响应时间

    • 代理模式可能会导致系统运行速度减慢,特别是在代理操作中加入了大量处理逻辑时。
  3. 设计难度

    • 正确地设计和实施代理模式需要仔细考虑整个系统的设计,以确保不会对系统性能产生负面影响。

类图

Client|v
Subject <---- Proxy <---- RealSubject

总结

代理模式提供了一种有效的方式来控制和管理对象的访问。通过使用代理,可以在保持业务对象职责清晰的同时,增加各种功能。此模式特别适用于需要对业务对象进行访问控制和其他预处理操作的场景。

外观模式(Facade Pattern)

外观模式(Facade Pattern)是一种结构型设计模式,它通过提供一个统一的接口,用来访问子系统中的一群接口,从而让复杂子系统更容易使用。外观模式定义了一个高层接口,使得这一子系统更加容易使用。

适用场景

  1. 简化复杂系统的接口

    • 为复杂的子系统提供一个简单的接口,减少外部与子系统的交互复杂度。
  2. 层次结构

    • 在多层系统结构中,可以使用外观模式定义每层的入口,简化层之间的依赖关系。
  3. 解耦系统

    • 通过引入外观模式,使得子系统与客户端之间的耦合度降低。

实现示例(Java)

以下是一个简单的外观模式的实现示例,展示如何通过外观类简化对子系统的使用。

1. 定义子系统类
public class SubsystemA {public void operationA() {System.out.println("SubsystemA: operationA");}
}public class SubsystemB {public void operationB() {System.out.println("SubsystemB: operationB");}
}public class SubsystemC {public void operationC() {System.out.println("SubsystemC: operationC");}
}
2. 定义外观类
public class Facade {private SubsystemA subsystemA;private SubsystemB subsystemB;private SubsystemC subsystemC;public Facade() {this.subsystemA = new SubsystemA();this.subsystemB = new SubsystemB();this.subsystemC = new SubsystemC();}public void operation1() {System.out.println("Facade: operation1");subsystemA.operationA();subsystemB.operationB();}public void operation2() {System.out.println("Facade: operation2");subsystemB.operationB();subsystemC.operationC();}
}
3. 客户端代码
public class Client {public static void main(String[] args) {Facade facade = new Facade();facade.operation1();facade.operation2();}
}

注释说明

  1. 子系统类

    • SubsystemA, SubsystemB, 和 SubsystemC 是子系统的具体实现类,每个类都有自己独特的操作方法。
  2. 外观类

    • Facade 类持有子系统的对象,并提供简化的接口 operation1operation2 来调用子系统的功能。
  3. 客户端代码

    • Client 类通过 Facade 类来调用 operation1operation2,从而简化了对复杂子系统的使用。

优点

  1. 简化接口

    • 外观模式为子系统提供了一个简单的接口,减少了与子系统交互的复杂度。
  2. 松散耦合

    • 外观模式使得子系统与客户端之间的耦合度降低,有助于提高系统的可维护性和扩展性。
  3. 更好的分层

    • 外观模式有助于建立一个清晰的分层结构,定义每层的入口。

缺点

  1. 不符合开闭原则

    • 增加新的子系统功能时,可能需要修改外观类,违背了开闭原则(对扩展开放,对修改关闭)。
  2. 可能造成性能问题

    • 在某些情况下,使用外观模式可能会导致系统性能下降,因为所有请求都需要经过外观类。

类图

Client|v
Facade ----> SubsystemA----> SubsystemB----> SubsystemC

总结

外观模式通过提供一个简化的接口,使得复杂子系统的使用变得更加容易。它适用于需要简化子系统接口、减少客户端与子系统直接交互、解耦系统层次结构的场景。尽管它有可能违反开闭原则,但在大多数情况下,它的优点远远超过其缺点,使得系统设计更加清晰和易于维护。

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

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

相关文章

力扣844.比较含退格的字符串

力扣844.比较含退格的字符串 栈模拟 class Solution {public:bool backspaceCompare(string s, string t) {int n s.size(),m t.size();stack<char> s1,s2;for(int i0;i<n;i){s1.push(s[i]);if(s[i] #){if(s1.size() 1) s1.pop();else s1.pop(),s1.pop();}}for(i…

利用Python的sympy包求解一元多次方程

一元1次方程 import sympy as sp # 导入sympy包 x sp.Symbol(x) # 定义符号变量 f 2*x -8 # 定义要求解的一元1次方程 x sp.solve(f) # 调用solve函数求解方程 x[4]一元2次方程 import sympy as sp # 导入sympy包 x sp.Symbol(x) # 定义符号变量 f …

网络安全合规建设

网络安全合规建设 一、法律安全需求基本合规&#xff08;1&#xff09;《网络安全法》重要节点等级保护政策核心变化 二、安全需求 业务刚需&#xff08;1&#xff09;内忧&#xff08;2&#xff09;外患 三、解决方法&#xff08;1&#xff09;总安全战略目标图&#xff08;2&…

广汇汽车:救得起来吗?

五折奔驰、六折宝马...BBA们“腰斩式”大降价后正在引发连锁反应。 国内第二大汽车经销商——广汇汽车&#xff0c;还好吗&#xff1f; 受新能源品牌冲击&#xff0c;近年来奔驰、宝马等豪华燃油品牌销量低迷&#xff0c;纷纷开启降价模式&#xff0c;首当其冲的就是以广汇汽车…

使用Python实现深度学习模型:跨平台模型移植与部署

引言 随着深度学习技术的快速发展,模型的跨平台移植与部署变得越来越重要。无论是将模型从开发环境移植到生产环境,还是在不同的硬件平台上运行,跨平台部署都能显著提高模型的实用性和可扩展性。本文将介绍如何使用Python实现深度学习模型的跨平台移植与部署,并提供详细的…

QT TCP多线程网络通信

学习目标&#xff1a; TCP网络通信编程 学习前置环境 运行环境:qt creator 4.12 QT TCP网络通信编程-CSDN博客 Qt 线程 QThread类详解-CSDN博客 学习内容 使用多线程技术实现服务端计数器 核心代码 客户端 客户端&#xff1a;负责连接服务端&#xff0c;每次连接次数1。…

从零开始做题:MP3

题目 给出一个mp3文件 解题 右键->selection->save selection->另存为xxx.png即可 8750d5109208213f E:\逐鹿\MISC\tools\MP3Stego_1_1_19\MP3Stego>.\decode -X cipher.mp3 MP3StegoEncoder 1.1.19 See README file for copyright info Input file cipher.mp3…

未来代理IP的发展趋势:创新、适应和可持续性

你是否好奇&#xff0c;未来代理IP将如何演变以适应日益复杂和全球化的网络环境&#xff1f;让我们探讨一下代理IP技术在创新、适应性和可持续发展方面的未来前景。 1. 创新技术驱动 未来的代理IP将依托创新技术&#xff0c;如边缘计算、区块链和深度学习。边缘计算技术的应用…

AcWing 5458:进水排水问题

【题目描述】 某已经蓄满水的泳池内装有 4 个水管。 前 2 个水管是进水管&#xff0c;单位时间的进水量分别为 a,b。 后 2 个水管是排水管&#xff0c;单位时间的排水量分别为 c,d。 请你计算&#xff0c;当 4 个水管同时工作时&#xff0c;是否可能将泳池里的水排干。【输入格…

53-5 内网代理7 - CS上线不出网主机

靶场搭建: 这里就用之前内网代理的靶场,把web服务器这台虚拟机关闭掉,用剩下的3台加kali 各个虚拟机的网络情况 kali - 可以连接外网win2008(之前的FTP服务器) 可以连接外网 win 7(之前的办公电脑) 不出网主机 - 无法连接外网win2012 克隆机(之前的域控) - 无法连接…

视频压缩文件太大了怎么缩小?3个压缩方法分享

视频压缩文件太大了怎么缩小&#xff1f;当视频压缩文件过大时&#xff0c;缩小其大小不仅能节省宝贵的存储空间&#xff0c;还能显著提升文件传输速度&#xff0c;特别是在网络条件有限的情况下。通过专业的视频压缩软件&#xff0c;可以有效减少文件体积&#xff0c;使视频内…

python库(9):prettytable库快速实现ASCII表格

下面介绍一个快速制作ASCII表格库——prettytable&#xff0c;可以方便地制作简单表格。 1 安装prettytable pip install -i https://pypi.tuna.tsinghua.edu.cn/simple prettytable 结果如下&#xff1a; 2 代码实例 from prettytable import PrettyTable table PrettyTa…

【Python系列】深入解析 Python 中的 JSON 处理工具

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

兼容MySQL和PostgreSQL协议的数据库

兼容MySQL和PostgreSQL协议的数据库 一、Aurora二、TDSQL数据库三、TDSQL-C数据库四、TDSQL-C MySQL 版和 TDSQL MySQL 版的区别 一、Aurora Aurora是由亚马逊网络服务&#xff08;AWS&#xff09;提供的一种关系型数据库引擎。它是在MySQL和PostgreSQL之上构建的&#xff0c;…

coco数据集格式计算mAP的python脚本

目录 背景说明COCOeval 计算mAPtxt文件转换为coco json 格式自定义数据集标注 背景说明 在完成YOLOv5模型移植&#xff0c;运行在板端后&#xff0c;通常需要衡量板端运行的mAP。 一般需要两个步骤 步骤一&#xff1a;在板端批量运行得到目标检测结果&#xff0c;可保存为yol…

【Django项目】基于Python+Django+MySQL的音乐网站系统项目

功能介绍 首页&#xff1a;歌曲分类、歌曲搜索、热门歌曲、热门下载、新歌推荐 歌曲排行&#xff1a;歌曲分类、分页功能 用户板块&#xff1a;用户登陆/注册、播放历史 歌曲详情&#xff1a;歌曲播放、当前播放列表、歌曲点评、歌曲播放插件、下载歌曲 系统后台&#xff1a;歌…

MySQL体系架构解析

1.MySQL体系架构 1.1.MySQL的分支与变种 MySQL变种有好几个,主要有三个久经考验的主流变种:Percona Server,MariaDB和 Drizzle。它们都有活跃的用户社区和一些商业支持,均由独立的服务供应商支持。同时还有几个优秀的开源关系数据库,值得我们了解一下。 1.1.1.Drizzle …

【Sql Server修改列类型错误信息:对象名依赖于列】

Sql Server修改列类型错误信息&#xff1a;对象名依赖于列 报错信息解决方法测试sql语句 报错信息 修改表中列类型&#xff0c;发生报错如下&#xff1a; [SQL Server]对象DF__Forecast___isCal__4E746892 依赖于 列isCalcFinished。 (5074) [42000] [Microsoft][ODBC Driver…

L2 LangGraph_Components

参考自https://www.deeplearning.ai/short-courses/ai-agents-in-langgraph&#xff0c;以下为代码的实现。 这里用LangGraph把L1的ReAct_Agent实现&#xff0c;可以看出用LangGraph流程化了很多。 LangGraph Components import os from dotenv import load_dotenv, find_do…

2024年高压电工证考试题库及高压电工试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年高压电工证考试题库及高压电工试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人员上岗证考试大纲随机出的高压…