C# 设计模式:装饰器模式与代理模式的区别

C# 设计模式:装饰器模式与代理模式的区别

在软件设计中,装饰器模式(Decorator Pattern)和代理模式(Proxy Pattern)都是结构型设计模式,它们的目的都是通过对对象进行包装,来增加或改变对象的行为。虽然它们有一些相似之处,但实际上,它们的设计初衷和使用场景有所不同。本文将通过对比这两种模式,帮助大家更好地理解它们的区别和应用场景。

1. 装饰器模式与代理模式的相似性

装饰器模式和代理模式在表面上有一定的相似性,主要体现在以下几个方面:

  • 都涉及到对对象的包装:无论是装饰器模式还是代理模式,都通过一个包装类来代理或装饰原有对象。
  • 都可以增强对象的功能:通过包装,装饰器模式和代理模式都可以在不改变原有对象代码的情况下,添加新的功能或行为。

然而,它们的核心差异在于目的和实现方式。

2. 装饰器模式 (Decorator Pattern)

目的:装饰器模式的目的是动态地为一个对象添加额外的功能或行为。装饰器通常是为了增强对象的功能,不会改变对象本身的行为。

特点

  • 装饰器模式的关键是递归地装饰对象。它通常是一个实现了相同接口或继承了相同类的对象,可以在运行时增加或修改被装饰对象的行为。
  • 装饰器模式可以在不修改原始对象的情况下,给对象动态地添加功能。

应用场景

  • 需要为一个对象添加额外的职责和行为,而又不想改变对象的结构。
  • 适合用在“责任链”或“动态行为扩展”场景中。
示例:C# 装饰器模式
using System;// 定义接口
public interface ICar
{void Assemble();
}// 具体组件:普通汽车
public class BasicCar : ICar
{public void Assemble(){Console.WriteLine("Assembling a basic car.");}
}// 装饰器:高级汽车
public class SportsCar : ICar
{private ICar car;public SportsCar(ICar car){this.car = car;}public void Assemble(){car.Assemble();Console.WriteLine("Adding features of sports car.");}
}// 装饰器:豪华汽车
public class LuxuryCar : ICar
{private ICar car;public LuxuryCar(ICar car){this.car = car;}public void Assemble(){car.Assemble();Console.WriteLine("Adding features of luxury car.");}
}// 客户端代码
class Program
{static void Main(){ICar sportsCar = new SportsCar(new BasicCar());sportsCar.Assemble();  // 组装运动型车Console.WriteLine();ICar sportsLuxuryCar = new LuxuryCar(new SportsCar(new BasicCar()));sportsLuxuryCar.Assemble();  // 组装豪华运动型车}
}

运行结果

Assembling a basic car.
Adding features of sports car.Assembling a basic car.
Adding features of sports car.
Adding features of luxury car.
3. 代理模式 (Proxy Pattern)

目的:代理模式的目的是通过控制访问来间接地管理对某个对象的操作。代理通常是为了控制对真实对象的访问,可以是为了延迟实例化、权限控制或做一些前置处理等。

特点

  • 代理模式的关键是控制对目标对象的访问。代理可以控制目标对象的创建、访问、权限检查等行为。
  • 代理模式的代理类通常实现与被代理类相同的接口,可以通过代理类来调用目标对象的方法。
  • 代理有时用于控制资源的访问,例如通过虚拟代理延迟加载,或者通过安全代理控制对敏感资源的访问。

应用场景

  • 需要在客户端和真实对象之间插入一个代理,以控制对真实对象的访问。
  • 用于懒加载(虚拟代理)、权限控制(保护代理)或日志监控等场景。
示例:C# 代理模式
using System;// 定义接口
public interface IRealSubject
{void Request();
}// 真实对象:实际操作的对象
public class RealSubject : IRealSubject
{public void Request(){Console.WriteLine("Request is being processed by the RealSubject.");}
}// 代理类:控制访问的代理
public class Proxy : IRealSubject
{private RealSubject realSubject;public void Request(){if (realSubject == null){realSubject = new RealSubject();  // 延迟实例化}Console.WriteLine("Proxy: Checking access before forwarding request.");realSubject.Request();  // 转发请求}
}// 客户端代码
class Program
{static void Main(){IRealSubject proxy = new Proxy();proxy.Request();  // 通过代理访问}
}

运行结果

Proxy: Checking access before forwarding request.
Request is being processed by the RealSubject.
4. 装饰器模式与代理模式的区别
方面装饰器模式 (Decorator)代理模式 (Proxy)
目的动态地添加功能或责任,使得对象的行为得到增强。控制对对象的访问,可能会在请求前进行权限检查或懒加载等操作。
行为装饰器改变或扩展对象的行为,不影响原有对象的接口。代理不改变对象的行为,主要用于控制访问权限。
实现方式装饰器是一个封装对象并实现相同接口的类。代理实现与被代理对象相同的接口,控制对对象的访问。
应用场景用于动态地为对象添加功能,通常不涉及对对象访问的控制。用于控制对对象的访问,例如延迟加载、权限控制等。
功能重点扩展功能和责任控制访问(懒加载、权限控制等)
5. 总结

尽管装饰器模式和代理模式看起来很相似,都是通过包装对象来增强或控制对象的行为,但它们有不同的设计目的和使用场景。装饰器模式主要用于增强对象的功能,而代理模式则主要用于控制访问,尤其是延迟加载、权限控制等。理解这两者的区别,可以帮助我们在开发中做出更加合适的设计决策。
在实际开发中,当你需要扩展对象的功能时,可以考虑使用装饰器模式;而当你需要控制对象的访问或者做一些额外的管理时,可以考虑使用代理模式。

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

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

相关文章

typescript安装后仍然不能使用tsc,如何解决

1.全局安装 npm i typescript -g 2.发现仍然不行 解决方法: C:\Users\你的用户名\AppData\Roaming\npm解决办法: 1.确定对应的文件下载了 我们发现typescript是下载了的 2.设置环境变量的path 路径为typescript下的npm 3.cmd运行

硬件-射频-PCB-常见天线分类-ESP32实例

文章目录 一:常见天线1.1 PCB天线①蓝牙模块的蛇形走线-天线②倒F天线-IFA:③蛇形倒F天线-MIFA④立体的倒F天线-PIFA 1.2 实例示意图1.21 对数周期天线(LPDA):1.22 2.4GHZ的八木天线:1.23 陶瓷天线:1.24 外接天线: 二&…

PCA降维算法详细推导

关于一个小小的PCA的推导 文章目录 关于一个小小的PCA的推导1 谱分解 (spectral decomposition)2 奇异矩阵(singular matrix)3 酉相似(unitary similarity)4 酉矩阵5 共轭变换6 酉等价7 矩阵的迹的计算以及PCA算法推导8 幂等矩阵(idempotent matrix)9 Von Neumanns 迹不等式 [w…

25.1.3

java数组: dataType[] arrayRefVar //推荐写法 //int[] mylist //或 dataType arrayRefVar[] //int mylist[]创建数组对象: arrayRefVar new dataType[arraySize]; dataType[] arrayRefVar new dataType[arraySize];for-each循环: jav…

音频进阶学习九——离散时间傅里叶变换DTFT

文章目录 前言一、DTFT的解释1.DTFT公式2.DTFT右边释义1) 复指数 e − j ω n e^{-j\omega n} e−jωn2)序列与复指数相乘 x [ n ] ∗ e − j ω n x[n]*e^{-j\omega n} x[n]∗e−jωn复指数序列复数的共轭正交正交集 3)复指数序列求和 3.DTF…

【保姆级】sql注入之堆叠注入

一、堆叠注入的原理 mysql数据库sql语句的默认结束符是以";"号结尾,在执行多条sql语句时就要使用结束符隔 开,而堆叠注入其实就是通过结束符来执行多条sql语句 比如我们在mysql的命令行界面执行一条查询语句,这时语句的结尾必须加上分号结束 select * fr…

我的桌面 1.9.75 | 个性化定制手机桌面,丰富的小组件和主题

我的桌面iScreen是一款万能桌面小组件APP,提供各种高颜值桌面主题与创意小组件自由组合。支持X面板、照片、待办清单、时钟、日历等实用有趣的小组件。拥有超过500种小组件供选择,包括灵动面板、滚动相册等,搭配300多种精美主题和高清壁纸&am…

汽车燃油软件标定测试

油箱测试 确定油箱的参数: 总容积,额定容积,不可用容积等。油泵测试(静态) 分为加油测试,减油测试,1L或者500ml增减; 分别测试油泵的阻值输出,类似: 油量 阻…

07-ArcGIS For JavaScript--隐藏参数qualitySettings(memory和lod控制)

目录 1、综述2、sceneview.qualitySettings2.1、sceneview.qualitySettings.memoryLimit2.2、lodFactor2.3 additionalCacheMemory 3、结论 1、综述 先上重点,SceneView.qualitySettings为隐藏对象参数,该对象的memoryLimit和lodFactor等值,…

信息科技伦理与道德1:研究方法

1 问题描述 1.1 讨论? 请挑一项信息技术,谈一谈为什么认为他是道德的/不道德的,或者根据使用场景才能判断是否道德。判断的依据是什么(自身的道德准则)?为什么你觉得你的道德准则是合理的,其他…

交换机关于环路、接口绑定、链路聚合的相关知识

文章目录 1、对交换机SW-1进行配置,仅允许Host-1通过Ethernet0/0/1接口与Host-3和Host-4通信,Host-2无法与其他主机通信。2、关闭生成树协议,验证环路造成的影响3、关闭生成树协议通过链路聚合实现两条链路正常通信并提高链路可靠性。 内容包…

QEMU网络配置简介

本文简单介绍下qemu虚拟机网络的几种配置方式。 通过QEMU的支持,常见的可以实现以下4种网络形式: 基于网桥(bridge)的虚拟网络。基于NAT(Network Addresss Translation)的虚拟网络。QEMU内置的用户模式网…

(二)当人工智能是一个函数,函数形式怎么选择?ChatGPT的函数又是什么?

在上一篇文章中,我们通过二次函数的例子,讲解了如何训练人工智能。今天,让我们进一步探讨:面对不同的实际问题,应该如何选择合适的函数形式? 一、广告推荐系统中的函数选择 1. 业务目标 想象一下&#x…

CentOS — 目录管理

文章目录 一、目录结构二、切换目录三、查看目录四、创建目录五、复制目录六、剪切目录七、删除目录 目录也是一种文件。 蓝色目录,绿色可执行文件,红色压缩文件,浅蓝色链接文件,灰色其它文件, 点开头的是隐藏文件&…

2025加密风云:行业变革与未来趋势全景透视

引言 2024年是加密行业发展历程中的重要一年,诸多事件和趋势为未来的发展奠定了基础。随着全球政策环境的变化、技术的不断进步以及市场参与者的多样化,加密行业在2025年将迎来新的转型与挑战。这篇文章将从政策、技术、市场、应用以及社会影响等多个角…

什么是.net framework,什么是.net core,什么是.net5~8,版本对应关系

我不知道有多少人和我一样,没学习过.netCore,想要学习,但是版本号太多就蒙了,不知道学什么了,这里解释下各个版本的关系 我们一般开始学习微软的时候,都是开始学习的.netframework,常用的就是4…

tcpdump指南(1)

大家读完觉得有意义记得关注和点赞!!! tcpdump是一种在网络上转储流量的网络工具。 这篇文章服务器作为一些常用命令的指南。如需完整指南, 请参阅手册页,或在 Linux 计算机上。man tcpdump 1 基本选项 帮助摘要&#…

如何利用 ClickHouse 实现高级分析:MySQL 到 ClickHouse 实时数据同步指南

在数据驱动的时代,企业必须依靠先进的数据分析能力来提升竞争力。随着数据量的激增和业务需求的复杂化,传统的关系型数据库已经无法满足高效处理和实时分析的需求。ClickHouse 作为一款高性能的列式数据库,凭借其卓越的查询性能和可扩展性&am…

UniApp | 从入门到精通:开启全平台开发的大门

UniApp | 从入门到精通:开启全平台开发的大门 一、前言二、Uniapp 基础入门2.1 什么是 Uniapp2.2 开发环境搭建三、Uniapp 核心语法与组件3.1 模板语法3.2 组件使用四、页面路由与导航4.1 路由配置4.2 导航方法五、数据请求与处理5.1 发起请求5.2 数据缓存六、样式与布局6.1 样…

MySQL8安装与卸载

1.下载mysql MySQL :: Download MySQL Community Serverhttps://dev.mysql.com/downloads/mysql/ 2.解压mysql安装包 解压到自己定义的目录,这里解压就是安装,解压后的路径不要有空格和中文。 3.配置环境变量 配置环境变量可以方便电脑在任何的路径…