c#设计模式-结构型模式 之 代理模式

前言        

        由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接 引用目标对象,代理对象作为访问对象和目标对象之间的中介。在学习代理模式的时候,可以去了解一下Aop切面编程AOP切面编程_aop编程_爱吃香蕉的阿豪的博客-CSDN博客,Aop底层实现通常使用代理模式

代理(Proxy)模式分为三种角色:

  1. 抽象角色(Subject)类: 通过接口或抽象类声明真实角色和代理对象实现的业务方法。
  2. 真实角色(Real Subject)类: 实现了抽象角色中的具体业务,是代理对象所代表的真实对 象,是最终要引用的对象。
  3. 代理(Proxy)类 : 提供了与真实角色相同的接口,其内部含有对真实角色的引用,它可以访 问、控制或扩展真实角色的功能。

举例

我们假设一种场景,电脑中有一个计算方法,传两个数字进去,得出一个合计,但是现在需要添加一个整数计算器,要把传进去的小数去除小数部分,只计算整数部分,但是原来的sum方法可能在其他地方还需要使用,因此不能修改原来的方法,我们使用代理模式来实现这一功能。

抽象角色

创建一个抽象角色计算机,里面有一个计算方法

public interface IComputer
{void calculator(double a, double b);
}

真实角色

实现类sum,对传进来的两个数进行相加

public class sum : IComputer
{public void calculator(double a, double b){Console.WriteLine(a + b);}
}

代理类 ProxySum

在代理类中,直接引用了真实角色sum,不过在这之前先对参数进行了去小数处理

public class ProxySum : IComputer
{private sum sum = new sum();public void calculator(double a, double b){a = Math.Floor(a);b = Math.Floor(b);sum.calculator(a, b);}
}

测试

先使用原来的真实角色sum,传入两个小数

    public static void Main(string[] args){var sum = new sum();sum.calculator(1.111,3.999);}

得到结果5.11

 

 然后我们再使用代理类proxySum

    public static void Main(string[] args){var proxySum = new ProxySum();proxySum.calculator(1.111,3.999);}

 得到的结果是去除小数后相加的结果

 总结

优点:

代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用;

代理对象可以扩展目标对象的功能; 代理模式能将客户端与目标对象分离,在一定程度上降低了系统的耦合度;

缺点: 增加了系统的复杂度;

 

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

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

相关文章

函数栈帧的创建与销毁

目录 引言 基础知识 内存模型 ​ 寄存器的种类与功能 常用的汇编指令 函数栈帧创建与销毁 main()函数栈帧的创建 NO1. NO2. NO3. NO4. NO5. NO6. main()函数栈帧变量的创建 调用Add()函数栈帧的预备工作——传参 NO1. NO2. NO3. Add()函数栈帧的创建 …

C++笔记之Class A a = b调用的什么构造函数(引例)

C笔记之Class A a b调用的什么构造函数(引例) code review! 文章目录 C笔记之Class A a b调用的什么构造函数(引例)1.C笔记之Class A a b调用的什么构造函数?2.常见的三种形式3.等价的两种形式 1.C笔记之Class A a b调用的什么构造函数? 2.常见的三…

认识Mybatis并实现增删查改

目录 一.Mybatis特性 二.常见持久层技术的比较 三.搭建Mybaits环境 四.使用Mybatis 五.通过Mybatis实现增删改 六.实现数据库的查询操作 一.Mybatis特性 定制化SQL:MyBatis允许开发人员编写、优化和管理自定义的SQL语句,可以满足复杂查询和存储过程等…

LeetCode 热题 100(五):54. 螺旋矩阵、234. 回文链表、21. 合并两个有序链表

题目一: 54. 螺旋矩阵https://leetcode.cn/problems/spiral-matrix/ 题目要求: 思路:一定要先找好边界。如下图 ,上边界是1234,右边界是8、12,下边界是9、10、11,左边界是5,所以可…

Unity如何控制声音大小(包括静音功能)

一:UGUI制作 1. 首先在【层级】下面创建UI里面的Slider组件。设置好它对应的宽度和高度。 2.调整Slider滑动条的填充颜色。一般声音颜色我黄色,所以我们也调成黄色。 我们尝试滑动Slider里面的value。 a.滑动前。 b.滑动一半。 c.滑动完。 从以上滑动va…

LeetCode235. 二叉搜索树的最近公共祖先

235. 二叉搜索树的最近公共祖先 文章目录 [235. 二叉搜索树的最近公共祖先](https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-search-tree/)一、题目二、题解方法一:递归方法二:迭代 一、题目 给定一个二叉搜索树, 找到该树中两个指定…

恢复NuGet包_解决:System.BadImageFormatException:无法加载文件或程序集

C#工程 主要是开发了一个 web api接口,这个工程源码去年还可以的,今年换了一个电脑打开工程就报错。 错误提示如下: 在 Microsoft.CodeAnalysis.CSharp.CommandLine.Program.Main(String[] args) Test1 System.BadImageFormatEx…

【腾讯云 TDSQL-C Serverless 产品体验】基于腾讯云轻量服务器以及 TDSQL-C 搭建 LNMP WordPress 博客系统

文章目录 一、前言二、数据库发展与云原生数据库2.1 数据库发展简介2.2 云原生数据库简介2.2.1 云数据库与云原生数据库区别 三、腾讯云 TDSQL-C 数据库3.1 什么是腾讯云 TDSQL-C 数据库3.2 为什么推出 TDSQL-C 数据库?传统 MySQL 架构存在较多痛点3.2.1 传统 MySQL…

Spring讲解和ioc用途及Web容器的整合

目录 一、Spring概述 ( 1 ) 背景 ( 2 ) 是什么 ( 3 ) 核心特性 二、Spring中的ioc 2.1 讲解 2.2 主要功能 2.3 实例演示 三、注入方式 3.1 set注入 3.2 构造注入 3.3 接口注入 四、Web容器整合 4.1 思考 4.2 实操 对我们的收获 一、Spring概述 ( 1 ) 背景 Spr…

EasyExcel工具 Java导出Excel表数据

EasyExcel 优点坐标依赖读Excel最简单的读的对象写Excel最简单的写的对象最简单的读的监听器填充Excel简单填充(对象)复杂填充(对象和列表)官网:https://easyexcel.opensource.alibaba.com/ EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。…

aosp-刷入Magisk面具获取root权限

作者:上山打鼠 一、简介 话说上次root手机都已经是初中的时候了,那时候捣鼓手机不亦乐乎,Android4.4的系统先解锁,再刷入第三方Recovery,然后再刷入Root包去获取Root权限 想学点逆向的知识,所以要root一下…

Redis中的有序集合及其底层跳表

前言 本文着重介绍Redis中的有序集合的底层实现中的跳表 有序集合 Sorted Set Redis中的Sorted Set 是一个有序的无重复值的集合,他底层是使用压缩列表和跳表实现的,和Java中的HashMap底层数据结构(1.8)链表红黑树异曲同工之妙…