当前位置: 首页 > news >正文

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.lryc.cn/news/132326.html

相关文章:

  • openpnp - 自动换刀的设置
  • 《HeadFirst设计模式(第二版)》第十章代码——状态模式
  • day-25 代码随想录算法训练营(19)回溯part02
  • PG逻辑备份与恢复
  • 图数据库_Neo4j和SpringBoot整合使用_实战创建明星关系图谱---Neo4j图数据库工作笔记0010
  • Linux网络编程:Socket套接字编程(Server服务器 Client客户端)
  • Mac OS下应用Python+Selenium实现web自动化测试
  • 每天一道leetcode:934. 最短的桥(图论中等广度优先遍历)
  • 【学习日记】【FreeRTOS】FreeRTOS 移植到 STM32F103C8
  • Qt 屏幕偶发性失灵
  • 如何在pycharm中指定GPU
  • C#判断字符串中有没有字母,正则表达式、IsLetter
  • Jtti:Ubuntu怎么限制指定端口和IP访问
  • 机器学习/深度学习需要掌握的linux基础命令
  • C++11 std::async推荐使用 std::launch::async 模式
  • 没有使用springboot 单独使用spring-boot-starter-logging
  • 创建Azure资源锁
  • 卷积神经网络教程 (CNN) – 使用 TensorFlow 在 Python 中开发图像分类器
  • MyBatis XML映射处理CLOB和BLOB类型
  • FPGA_学习_14_第一个自写模块的感悟和ila在线调试教程与技巧(寻找APD的击穿偏压)
  • 【2023新教程】树莓派定时自动拍照并上传腾讯云对象存储COS
  • 校企合作谋发展 合作共赢谱新篇|云畅科技与湖南民族职业学院签订校企合作协议
  • vue技术学习
  • 基于空间的图卷积神经网络:GNN
  • .net core发布到IIS上出现 HTTP 错误 500.19
  • 01_Redis单线程与多线程
  • 机器学习——随机森林【手动代码】
  • Vue 2 处理边界情况
  • 写一个mysql 正则表达式,每三个img标签图片后面添加<hr>
  • Spring MVC异常处理