代理模式结构
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6
7 namespace DesignMode.StructuralPattern
8 {
9 #region 代理模式要点
10 //
11 //定义:提供对象的替代品,代理控制着对原对象的访问,允许在提交请求给对象前后进行一些操作。
12 // 延迟初始化 (虚拟代理):
13 // 如果你有一个偶尔使用的重量级服务对象, 一直保持该对象运行会消耗系统资源时, 可使用代理模式。
14 // 访问控制 (保护代理):控制一个对象的访问,可以给不同的用户提供不同级别的使用权限。
15 // 本地执行远程服务 (远程代理):适用于服务对象位于远程服务器上的情形
16 // 记录日志请求 (日志记录代理):适用于当你需要保存对于服务对象的请求历史记录时。
17 // 代理可以在向服务传递请求前进行记录。
18 // 智能引用:可在没有客户端使用某个重量级对象时立即销毁该对象。
19 //
20 /*
21 实现方式:
22 1.如果没有现成的服务接口, 你就需要创建一个接口来实现代理和服务对象的可交换性。
23 从服务类中抽取接口并非总是可行的,因为你需要对服务的所有客户端进行修改,让它们使用接口。
24 备选计划是将代理作为服务类的子类, 这样代理就能继承服务的所有接口了。
25
26 2.创建代理类, 其中必须包含一个存储指向服务的引用的成员变量。代理负责创建服务并对其整个生命周期进行管理。
27
28 3.根据需求实现代理方法,代理可在完成一些任务后应将工作委派给服务对象。
29
30 4.可以考虑新建一个构建方法来判断客户端可获取的是代理还是实际服务
31
32 5.可以考虑为服务对象实现延迟初始化。
33 */
34 #endregion
35
36 public interface ISubject
37 {
38 void OperationStart();
39 }
40
41 public class ProxyPattern : ISubject
42 {
43 RealSubject _realSubject = null;
44 public ProxyPattern(RealSubject subject)
45 {
46 _realSubject = subject;
47 }
48
49 public void OperationStart()
50 {
51 if (CheckAccess())
52 {
53 _realSubject.OperationStart();
54 LogAccess();
55 }
56 }
57
58 public bool CheckAccess()
59 {
60 // Some real checks should go here.
61 Console.WriteLine("Proxy: Checking access prior to a real request.");
62
63 return true;
64 }
65
66 public void LogAccess()
67 {
68 Console.WriteLine($"Proxy: Logging the time of request");
69 }
70 }
71
72 public class RealSubject : ISubject
73 {
74 public void OperationStart()
75 {
76 Console.WriteLine("real subject Start operation");
77 }
78 }
79
80
81 public class ProxyClient
82 {
83 public static void Test()
84 {
85 RealSubject realSubject = new RealSubject();
86 ClientCode(realSubject);
87
88 ProxyPattern subject = new ProxyPattern(realSubject);
89 ClientCode(subject);
90
91 }
92
93 public static void ClientCode(ISubject subject)
94 {
95 subject.OperationStart();
96 }
97 }
98 }