码迷,mamicode.com
首页 > Web开发 > 详细

.net设计模式-代理模式

时间:2019-09-08 00:10:31      阅读:123      评论:0      收藏:0      [点我收藏+]

标签:构造   通过   接口   原来   ace   ons   的区别   lse   prepare   

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                 }

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

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

 

.net设计模式-代理模式

标签:构造   通过   接口   原来   ace   ons   的区别   lse   prepare   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!