推荐阅读:

前言

       在软件开发过程中,当无法直接访问某个对象或访问某个对象存在困难时,我们希望可以通过一个中介来间接访问,这就是今天我们要研究的代理模式。

介绍

       代理模式:为其他对象提供一种代理以控制对这个对象的访问,一个类代表另一个类的功能。为了保证客户端使用的透明性,所访问的真实对象与代理对象需要实现相同的接口。

代理模式的元素:

(1) Subject(抽象主题):它声明了真实主题和代理主题的共同接口,这样一来在任何使用真实主题的地方都可以使用代理主题,客户端通常需要针对抽象主题角色进行编程。

(2) Proxy(代理主题):它包含了对真实主题的引用,从而可以在任何时候操作真实主题对象;在代理主题角色中提供一个与真实主题角色相同的接口,以便在任何时候都可以替代真实主题;代理主题角色还可以控制对真实主题的使用,负责在需要的时候创建和删除真实主题对象,并对真实主题对象的使用加以约束。通常,在代理主题角色中,客户端在调用所引用的真实主题操作之前或之后还需要执行其他操作,而不仅仅是单纯调用真实主题对象中的操作。

(3) RealSubject(真实主题):它定义了代理角色所代表的真实对象,在真实主题角色中实现了真实的业务操作,客户端可以通过代理主题角色间接调用真实主题角色中定义的操作。

下面举个例子来介绍下代理模式:

       假设有一群人是互相的好朋友,其中A和B吵架了,A想和B和好,但是由于不好意思直接说,因此就随便找了剩下人中的一个(假设是C),想C帮A给B道歉。此时把除AB剩余的人作为抽象主题,把A作为代理主题,C就是真实主题。

1.创建抽象主题

  1. abstract class Friends
  2. {
  3. public abstract void Apology(string msg);
  4. protected virtual void Apologyed()
  5. {
  6. Console.WriteLine("帮忙道歉完成~~~~~");
  7. }
  8. }

2.真实主题

  1. class Friend_C: Friends
  2. {
  3. public override void Apology(string msg)
  4. {
  5. //业务方法具体实现代码
  6. Console.WriteLine(msg);
  7. Apologyed();
  8. }
  9. protected override void Apologyed() {
  10. Console.WriteLine("Friend_C帮忙道歉完成~~~~~");
  11. }
  12. }

3.代理类

  1. class Friend_A: Friends
  2. {
  3. private Friend_C friend_C= new Friend_C(); //维持一个对真实主题对象的引用
  4. public override void Apology(string msg)
  5. {
  6. friend_C.Apology(msg);
  7. }
  8. }

4.使用代理模式

  1. public class Program {
  2. private static Friend_A friend_A= null;
  3. public static void Main(string[] args) {
  4. friend_A= new Friend_A();
  5. friend_A.Apology("对不起B,我(A)错了");
  6. Console.ReadKey();
  7. }
  8. }

5.整合后的代码

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace 代理模式
  7. {
  8. abstract class Friends
  9. {
  10. public abstract void Apology(string msg);
  11. protected virtual void Apologyed()
  12. {
  13. Console.WriteLine("帮忙道歉完成~~~~~");
  14. }
  15. }
  16. class Friend_C : Friends
  17. {
  18. public override void Apology(string msg)
  19. {
  20. //业务方法具体实现代码
  21. Console.WriteLine(msg);
  22. Apologyed();
  23. }
  24. protected override void Apologyed() {
  25. Console.WriteLine("Friend_C帮忙道歉完成~~~~~");
  26. }
  27. }
  28. class Friend_A : Friends
  29. {
  30. private Friend_C friend_C = new Friend_C (); //维持一个对真实主题对象的引用
  31. public override void Apology(string msg)
  32. {
  33. friend_C .Apology(msg);
  34. }
  35. }
  36. public class Program
  37. {
  38. private static Friend_A friend_A= null;
  39. public static void Main(string[] args)
  40. {
  41. friend_A= new Friend_A ();
  42. friend_A.Apology("对不起B,我(A)错了");
  43. Console.ReadKey();
  44. }
  45. }
  46. }

优缺点

优点:

      职责清晰;高扩展性;智能化。

缺点:

      由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢;实现代理模式需要额外的工作,有些代理模式的实现非常复杂。

总结

       在实际开发过程中,代理类的实现比上述代码要复杂很多,代理模式根据其目的和实现方式不同可分为很多种类,其中常用的几种代理模式简要说明如下:

(1) 远程代理(Remote Proxy):为一个位于不同的地址空间的对象提供一个本地的代理对象,这个不同的地址空间可以是在同一台主机中,也可是在另一台主机中,远程代理又称为大使(Ambassador)。

(2) 虚拟代理(Virtual Proxy):如果需要创建一个资源消耗较大的对象,先创建一个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建。

(3) 保护代理(Protect Proxy):控制对一个对象的访问,可以给不同的用户提供不同级别的使用权限。

(4) 缓冲代理(Cache Proxy):为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。

(5) 智能引用代理(Smart Reference Proxy):当一个对象被引用时,提供一些额外的操作,例如将对象被调用的次数记录下来等。

设计模式(C#)——11代理模式的更多相关文章

  1. 【HeadFirst设计模式】11.代理模式

    定义: 为另一个对象提供一个替身或占位符以访问这个对象. 远程代理 虚拟代理 保护代理.动态代理 其它: 远程代理的远程接口必须继承记号接口Remote 远程代理的使用过程中,要注意序列化的问题, 远 ...

  2. java设计模式之Proxy(代理模式)

    java设计模式之Proxy(代理模式) 2008-03-25 20:30 227人阅读 评论(0) 收藏 举报 设计模式javaauthorizationpermissionsstringclass ...

  3. Java设计模式之《代理模式》及应用场景

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6525527.html 代理模式算是我接触较早的模式,代理就是中介,中间人.法律上也有代理, ...

  4. Java设计模式:Proxy(代理)模式

    概念定义 代理模式是一种使用代理对象来执行目标对象的方法并在代理对象中增强目标对象方法的一种设计模式. 使用代理模式的原因有: 中介隔离作用:在某些情况下,一个客户类不想或者不能直接引用一个委托对象, ...

  5. 简介Python设计模式中的代理模式与模板方法模式编程

    简介Python设计模式中的代理模式与模板方法模式编程 这篇文章主要介绍了Python设计模式中的代理模式与模板方法模式编程,文中举了两个简单的代码片段来说明,需要的朋友可以参考下 代理模式 Prox ...

  6. 设计模式系列之代理模式(Proxy Pattern)——对象的间接访问

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  7. Head First 设计模式 --11 代理模式

    代理模式:为另一个对象提供一个替身或占位符以控制对这个对象的访问. 代码: interface Boss { public void meeting(); } class BossImp implem ...

  8. 设计模式学习之代理模式(Proxy,结构型模式)(11)

    参考地址:http://www.cnblogs.com/zhili/p/ProxyPattern.html 一.引言 在软件开发过程中,有些对象有时候会由于网络或其他的障碍,以至于不能够或者不能直接访 ...

  9. Java设计模式—Proxy动态代理模式

    代理:设计模式 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理. 图 1. 代 ...

随机推荐

  1. Hadoop学习(3)-mapreduce快速入门加yarn的安装

    mapreduce是一个运算框架,让多台机器进行并行进行运算, 他把所有的计算都分为两个阶段,一个是map阶段,一个是reduce阶段 map阶段:读取hdfs中的文件,分给多个机器上的maptask ...

  2. python模块导入-软件开发目录规范-01

    模块 模块的基本概念 模块: # 一系列功能的结合体 模块的三种来源 """ 模块的三种来源 1.python解释器内置的模块(os.sys....) 2.第三方的别人写 ...

  3. jQuery中事件与动画

    jQuery中的事件与动画   一. jQuery中的事件 jQuery事件是对javaScript事件的封装. 1.基础事件 在javaScript中,常用的基础事件有鼠标事件.键盘事件.windo ...

  4. iOS程序员 如何提升核心竞争力,防止自己被裁员?

    前言: 核心竞争力最早由普拉哈拉德和加里·哈默尔两位教授提出,通常认为核心竞争力,即企业或个人相较于竞争对手而言所具备的竞争优势与核心能力差异, 说白了就是你的优势,而且最好是独一无二的的优势,这就是 ...

  5. 章节十五、5-记录日志---Log4j

    一.为什么要用Log4j记录日志? 日志记录对于任何应用程序都非常重要. 它可以帮助我们快速调试代码,通过收集代码执行的信息让代码容易维护. 二.Log4j 是什么? Apache为Java提供的日志 ...

  6. spark shuffle写操作三部曲之BypassMergeSortShuffleWriter

    前言 再上一篇文章 spark shuffle的写操作之准备工作 中,主要介绍了 spark shuffle的准备工作,本篇文章主要介绍spark shuffle使用BypassMergeSortSh ...

  7. c#小灶——数据类型

    C#中有许多数据类型,存储不同的数据要用不同的数据类型.我们这里面向初学只介绍值类型,引用类型和指针类型在后续的学习中会有接触. 整型 int是最常用的整型,用来存储整数.除了int之外,还有其他不常 ...

  8. Web项目如何做单元测试

    你可能会用单元测试框架,python的unittest.pytest,Java的Junit.testNG等. 那么你会做单元测试么!当然了,这有什么难的? test_demo.py def inc(x ...

  9. 简洁明了的Noip考场策略 / 平时做题也适用

    1.选择策略: 评估的标准得分的难度不是AC的难度 2.思考问题: 怀疑的眼光审视自己 3.写代码前: 想想可不可以换一种代码实现会好写很多 把自己的思路再理一遍,可以写到纸上,记下来大致关键顺序 4 ...

  10. 佳木斯集训Day4

    Day4的出题人好毒瘤啊!!! T1我打表过的,正解现在也不会 #include <bits/stdc++.h> #define MAXN 10050 #define ll long lo ...