.net设计模式-代理模式

1.行为型设计模式:关注类与类之间的关系

代理模式:通过代理类来访问业务类,在不修改业务类的前提下可以扩展功能;

业务接口

 1  /// <summary>
 2     /// 业务接口
 3     /// </summary>
 4     public interface ISubject
 5     {
 6         /// <summary>
 7         /// get
 8         /// </summary>
 9         /// <returns></returns>
10         bool GetSomething();
11
12         /// <summary>
13         /// do
14         /// </summary>
15         void DoSomething();
16     }

实现

 1 /// <summary>
 2     /// 一个耗时耗资源的对象方法
 3     /// 一个第三方封装的类和方法
 4     /// </summary>
 5     public class RealSubject : ISubject
 6     {
 7         public RealSubject()
 8         {
 9             Thread.Sleep(2000);
10             long lResult = 0;
11             for (int i = 0; i < 100000000; i++)
12             {
13                 lResult += i;
14             }
15             Console.WriteLine("RealSubject被构造。。。");
16         }
17
18         /// <summary>
19         /// 火车站查询火车票
20         /// </summary>
21         public bool GetSomething()
22         {
23             //Console.WriteLine("prepare GetSomething");
24             Console.WriteLine("坐车去火车站看看余票信息。。。");
25             Thread.Sleep(3000);
26             Console.WriteLine("到火车站,看到是有票的");
27             return true;
28         }
29
30         /// <summary>
31         /// 火车站买票
32         /// </summary>
33         public void DoSomething()
34         {
35             Console.WriteLine("开始排队。。。");
36             Thread.Sleep(2000);
37             Console.WriteLine("终于买到票了。。。");
38         }
39     }

调用

1   {
2                     Console.WriteLine("***********Real**************");
3
4                     //ISubject subject = new RealSubject();//持有资源 /数据库链接
5                     //subject.GetSomething();
6                     //subject.DoSomething();
7                 }

通过代理模式添加日志

 1  /// <summary>
 2     /// 代理:只能传达原有逻辑,不能新增业务逻辑
 3     /// 包一层:没有什么技术问题是包一层不能解决的,如果有,就再包一层
 4     /// 属于自己的地盘  领域  就是可以为所欲为
 5     /// 日志  修改代理类完成   日志代理  避免对业务类修改
 6     /// 单例  修改代理类完成   搞个static (并不是强制单例)   避免对业务类修改
 7     /// 缓存  修改代理类完成   加个缓存逻辑   避免对业务类修改
 8     /// 。。。。
 9     ///
10     /// </summary>
11     public class ProxySubject : ISubject
12     {
13         /// <summary>
14         ///
15         /// </summary>
16         private static ISubject _iSubject = new RealSubject();
17
18         private static Dictionary<string, bool> ProxySubjectDictionary = new Dictionary<string, bool>();
19
20         /// <summary>
21         /// 火车站查询火车票
22         /// </summary>
23         public bool GetSomething()
24         {
25             Console.WriteLine("before GetSomething");
26             bool _BooleanResult = false;
27             string key = "GetSomething";
28             if (ProxySubjectDictionary.ContainsKey(key))
29             {
30                 _BooleanResult = ProxySubjectDictionary[key];
31             }
32             else
33             {
34                 _BooleanResult = _iSubject.GetSomething();
35                 ProxySubjectDictionary.Add(key, _BooleanResult);
36             }
37             Console.WriteLine("after GetSomething");
38             return _BooleanResult;
39         }
40
41         /// <summary>
42         /// 火车站买票
43         /// </summary>
44         public void DoSomething()
45         {
46             Console.WriteLine("before DoSomething");
47             _iSubject.DoSomething();
48             Console.WriteLine("after DoSomething");
49         }
50     }

调用

1   {
2                     Console.WriteLine("***********Proxy**************");
3                     ISubject subject = new ProxySubject();
4
5                     subject.GetSomething();
6                     subject.DoSomething();
7                 }

代理模式和适配器模式的区别

两者的关注点不同,适配器关注把新的类也适配到原来的业务中,而代理模式关注不改变原来的业务,而去进行扩展

原文地址:https://www.cnblogs.com/Spinoza/p/11483978.html

时间: 2024-08-07 06:15:39

.net设计模式-代理模式的相关文章

设计模式 - 代理模式(proxy pattern) 未使用代理模式 详解

代理模式(proxy pattern) 未使用代理模式 详解 本文地址: http://blog.csdn.net/caroline_wendy 部分代码参考: http://blog.csdn.net/caroline_wendy/article/details/37698747 如果需要监控(monitor)类的某些状态, 则需要编写一个监控类, 并同过监控类进行监控. 但仅仅局限于本地, 如果需要远程监控, 则需要使用代理模式(proxy pattern). 具体方法: 1. 类中需要提供

设计模式——代理模式

概念 代理模式(Proxy),为其他对象提供一种代理以控制对象的访问. 模式结构 一个是真正的你要访问的对象(目标类),一个是代理对象,真正对象与代理对象实现同一个接口,先访问代理类再 访问真正要访问的对象. 代理模式UML图 代码实战 <span style="font-family:KaiTi_GB2312;font-size:18px;"> //代理模式 class  Proxy : IGiveGift                   //让"代理&qu

23种设计模式----------代理模式(二)

(上一篇)23种设计模式----------代理模式(一) 之前说了基本的代理模式和普通代理模式.接下来开始看下强制代理模式和虚拟代理模式 三,强制代理模式: 一般的代理模式都是通过代理类找到被代理的对象,从而调用被代理类中的方法(即完成被代理类中的任务). 而,强制代理模式则是先找到被代理类自己去完成事情,然后被代理类又将该做的事情转交到代理类中,让代理类来完成. 假如:你有事求助于某位名人. 你告诉名人说有事想请他帮忙,然后他说最近一段时间比较忙,要不你找我的经纪人来办吧. (本来找名人办事

23种设计模式----------代理模式(三) 之 动态代理模式

(上一篇)种设计模式----------代理模式(二) 当然代理模式中,用的最广泛的,用的最多的是  动态代理模式. 动态代理:就是实现阶段不用关系代理是哪个,而在运行阶段指定具体哪个代理. 抽象接口的类图如下: --图来自设计模式之禅 所以动态代理模式要有一个InvocationHandler接口 和 GamePlayerIH实现类.其中 InvocationHandler是JD提供的动态代理接口,对被代理类的方法进行代理. 代码实现如下 抽象主题类或者接口: 1 package com.ye

23种设计模式----------代理模式(一)

代理模式也叫委托模式. 代理模式定义:对其他对象提供一种代理从而控制对这个对象的访问.就是,代理类 代理 被代理类,来执行被代理类里的方法. 一般情况下,代理模式化有三个角色. 1,抽象的主题类(或者接口) IGamePlayer 2,代理类. 3,被代理类. 下面以游戏玩家代理为例. 一,先来看下最基本的代理模式. 代码如下: 主题接口: 1 package com.yemaozi.proxy.base; 2 3 //游戏玩家主题接口 4 public interface IGamePlaye

5.大话设计模式-代理模式

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DesignModel { public class Proxy:IAction { ZQZ zzz = null; public Proxy(ZQZ mm) { zzz = mm; } public void SendFlower() { zzz

设计模式----代理模式(Proxy)

为还有一个对象提供一个替身或占位符以控制对这个对象的訪问. 代理模式的组成: 主题接口(Subject):提取真正主题与代理的公共方法,让使用真正主题的地方也能用代理取代. 真正主题(RealSubject):真正处理请求的类. 代理(Proxy):真正主题的代理类,请求方通过调用代理对象间接调用真正主题. 代理模式的简单样例: (主题接口类)Subject.java package xu.neng.Proxy; public interface Subject { public void re

一起学java设计模式--代理模式(结构型模式)

代理模式 应用软件所提供的桌面快捷方式是快速启动应用程序的代理,桌面快捷方式一般使用一张小图片来表示(Picture),通过调用快捷方式的run()方法将调用应用软件(Application)的run()方法.使用代理模式模拟该过程,绘制类图并编程实现. package ProxyPattern; interface Software { void run(); } class Application implements Software { public void run() { Syste

设计模式-代理模式(Go语言描述)

大家好, 我是大帅哥,由于最近又变帅了, 所以我决定由我的代理人小帅哥来写这篇博客,不过内容可以放心,还是由我来完成,小帅哥的活就是将我的内容替我发出来罢了. &_& 还是进入正题吧, 今天这篇博客我们继续来学习设计模式, 在学习了上面几个设计模式之后大家有没有发现设计模式其实很简单, 难道地方是何时选用合适的模式, 这也是设计模式最重要的地方, 不能我们学会的设计模式就可以乱用. 明白就好-- 下面我们就开始介绍一个新的设计模式-代理模式. 模式定义 什么是代码模式? 其实文章刚开始的段

Java设计模式-代理模式之动态代理(附源码分析)

Java设计模式-代理模式之动态代理(附源码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的区别就是:动态代理是在运行时刻动态的创建出代理类及其对象.上篇中的静态代理是在编译的时候就确定了代理类具体类型,如果有多个类需要代理,那么就得创建多个.还有一点,如果Subject中新增了一个方法,那么对应的实现接口的类中也要相应的实习该方法,不符合设计模式原则. 动态代理的做法:在运行时刻,可以动态创建出一个实现了多个接口的代理类.每个代理类的对象都会关联一个表示内部处理