设计模式-代理模式(Proxy)
2013-11-14 21:59
681 查看
应用场景:
领导都有秘书,一般会代理领导的部分职能角色,处理签字、报销、开会等任务。很多新人可能都只知道秘书的存在,毕竟每天与其打交道,不知道领导的存在。但是领导的的确确是真实存在的。
场景说明:
代理模式就是创建一个代理对象(秘书),用这个代理对象去代表真实对象。客户端得到这个对象以后,跟得到真实对象一样来使用。
当客户端操作代理对象时,实际上功能最终还是会由真实的对象来完成,只不过通过代理来操作而已。最终表现为,客户端操作代理,代理操作真实对象,对应上面的,员工都找秘书办事,秘书统一向领导汇报。
代理对象加载客户端和被代理的对象中间,我们就可以有一些变通,比如说,秘书会对所有事务筛选下,如果事情比较小,比较说请假签字,秘书可能直接就处理掉了,如果事情比较大,比如说部门预算,秘书就需要向领导汇报。
代理模式:为其它对象提供一种代理以控制对这个对象的访问。
代理模式的组成:
Subject:目标接口。定义代理对象和具体目标对象的接口,这样就可以在任何使用目标对象的地方使用代理对象。
RealSubject:具体的目标对象。真正实现目标接口要求的功能。
Proxy:代理对象。他具有以下特征:
a.实现目标接口Subject,这样就可以使用代理对象来代替具体的目标对象
b.保存一个具体目标对象实例,这样可以在需要的时候调用具体目标对象。
c.可以控制对具体模板对象的访问。
代码如下:
Subject和RealSubject类(即领导)的代码:
代理者Proxy(即秘书)的代码如下:
测试类代码:
补充描述:
代理模式的实质为:控制对象访问
代理模式的几种用途:
1.远程代理:一个对象可能存在于不同的地址空间。但是客户端通过远程代理去调用时,不需要关心这个对象在哪里,也不关心如何通过网络去访问。仅仅是使用代理对象而已
2.虚代理:根据需要来创建大的对象。只有到必须创建对象时,虚代理才会创建,相当于延迟加载,以时间换空间。
3.保护代理,即上文的例子中对于事务重要等级低于2级,秘书自己处理。代理类中,可以执行附件的逻辑,如权限控制、业务逻辑控制,而不需要修改被代理的对象。
通过代理从另外一种层面增加目标对象的功能。
代理模式的变通:
上面的例子中,真实目标对象(Manager)和代理对象(SecretaryProxy)都实现了ManagerAPI 接口。
实际上,代理对象直接继承目标对象即可
变通版本的代理模式组成为:
RealSubject:具体的目标对象,即上文中的领导。
Proxy:代理对象,即上文中的秘书。
他继承RealSubject,以便直接调用基类方法。真正实现了在客户端隐藏具体的目标对象。
代码实现为:
简化版本的代理模式,其实可以简单的理解为类的继承和方法的重写。
领导都有秘书,一般会代理领导的部分职能角色,处理签字、报销、开会等任务。很多新人可能都只知道秘书的存在,毕竟每天与其打交道,不知道领导的存在。但是领导的的确确是真实存在的。
场景说明:
代理模式就是创建一个代理对象(秘书),用这个代理对象去代表真实对象。客户端得到这个对象以后,跟得到真实对象一样来使用。
当客户端操作代理对象时,实际上功能最终还是会由真实的对象来完成,只不过通过代理来操作而已。最终表现为,客户端操作代理,代理操作真实对象,对应上面的,员工都找秘书办事,秘书统一向领导汇报。
代理对象加载客户端和被代理的对象中间,我们就可以有一些变通,比如说,秘书会对所有事务筛选下,如果事情比较小,比较说请假签字,秘书可能直接就处理掉了,如果事情比较大,比如说部门预算,秘书就需要向领导汇报。
代理模式:为其它对象提供一种代理以控制对这个对象的访问。
代理模式的组成:
Subject:目标接口。定义代理对象和具体目标对象的接口,这样就可以在任何使用目标对象的地方使用代理对象。
RealSubject:具体的目标对象。真正实现目标接口要求的功能。
Proxy:代理对象。他具有以下特征:
a.实现目标接口Subject,这样就可以使用代理对象来代替具体的目标对象
b.保存一个具体目标对象实例,这样可以在需要的时候调用具体目标对象。
c.可以控制对具体模板对象的访问。
代码如下:
Subject和RealSubject类(即领导)的代码:
/// <summary> /// 领导管理接口 -Subject /// </summary> public interface ManagerAPI { void Handle(Issue aIssue); } /// <summary> /// 领导-RealSubject /// </summary> public class Manager : ManagerAPI { public void Handle(Issue aIssue) { Console.WriteLine("领导处理:{0}", aIssue.Name); } }
代理者Proxy(即秘书)的代码如下:
/// <summary> /// 秘书-Proxy,也继承ManagerAPI 接口 /// </summary> public class SecretaryProxy : ManagerAPI { /// <summary> /// 代理对象内部保存一个具体模板对象、即被代理者的实例,这样在需要的时候直接调用被代理者 /// </summary> private Manager _manager; /// <summary> /// 秘书类构造函数,将被代理的对象(领导)作为参数传入进来,也可以通过属性传入 /// </summary> /// <param name="aManager"></param> public SecretaryProxy(Manager aManager) { _manager = aManager; } public void Handle(Issue aIssue) { //秘书Handle方法中会对事件作一些过滤,如果重要等级低于2级,直接处理掉,否则向领导汇报,请求领导处理 if (aIssue.IssueLevel < 2) Console.WriteLine("秘书处理:{0}", aIssue.Name); else _manager.Handle(aIssue); } }
测试类代码:
/// <summary> /// 代理模式测试类 /// </summary> public class ProxyTest { public static void Main() { //领导 Manager manager = new Manager(); //秘书,同时表明秘书是领导的代理 ManagerAPI secretary = new SecretaryProxy(manager); Issue issue1 = new Issue("请假三天", 1); secretary.Handle(issue1); Issue issue2 = new Issue("报销三万", 3); secretary.Handle(issue2); Console.ReadLine(); } }
补充描述:
代理模式的实质为:控制对象访问
代理模式的几种用途:
1.远程代理:一个对象可能存在于不同的地址空间。但是客户端通过远程代理去调用时,不需要关心这个对象在哪里,也不关心如何通过网络去访问。仅仅是使用代理对象而已
2.虚代理:根据需要来创建大的对象。只有到必须创建对象时,虚代理才会创建,相当于延迟加载,以时间换空间。
3.保护代理,即上文的例子中对于事务重要等级低于2级,秘书自己处理。代理类中,可以执行附件的逻辑,如权限控制、业务逻辑控制,而不需要修改被代理的对象。
通过代理从另外一种层面增加目标对象的功能。
代理模式的变通:
上面的例子中,真实目标对象(Manager)和代理对象(SecretaryProxy)都实现了ManagerAPI 接口。
实际上,代理对象直接继承目标对象即可
变通版本的代理模式组成为:
RealSubject:具体的目标对象,即上文中的领导。
Proxy:代理对象,即上文中的秘书。
他继承RealSubject,以便直接调用基类方法。真正实现了在客户端隐藏具体的目标对象。
代码实现为:
/// <summary> /// 领导-RealSubject /// </summary> public class Manager { public virtual void Handle(Issue aIssue) { Console.WriteLine("领导处理:{0}", aIssue.Name); } } /// <summary> /// 秘书-Proxy /// </summary> public class SecretaryProxy : Manager { public override void Handle(Issue aIssue) { //秘书Handle方法中会对事件作一些过滤,如果重要等级低于2级,直接处理掉,否则向领导汇报,请求领导处理 if (aIssue.IssueLevel < 2) Console.WriteLine("秘书处理:{0}", aIssue.Name); else base.Handle(aIssue); } } /// <summary> /// 代理模式测试类 /// </summary> public class ProxyTest { public static void Main() { //秘书,同时表明秘书是领导的代理 SecretaryProxy secretary = new SecretaryProxy(); Issue issue1 = new Issue("请假三天", 1); secretary.Handle(issue1); Issue issue2 = new Issue("报销三万", 3); secretary.Handle(issue2); Console.ReadLine(); } }
简化版本的代理模式,其实可以简单的理解为类的继承和方法的重写。
相关文章推荐
- Proxy Design Pattern(代理设计模式)
- 设计模式 - 代理(Proxy)
- 【设计模式】—— 代理模式Proxy
- 设计模式之Proxy(代理)
- 设计模式--代理模式Proxy(结构型)
- 设计模式之(六)代理模式Proxy
- 设计模式之动态代理-proxy
- 【设计模式】代理模式Proxy---静态代理
- 设计模式学习-Proxy(代理模式)
- 设计模式之五 --- 代理(Proxy)模式
- Java设计模式——Proxy(代理)模式
- 咕泡-代理 proxy 设计模式笔记
- 浅谈JAVA设计模式之——代理模式(proxy)
- 设计模式之五 --- 代理(Proxy)模式
- 步步为营 .NET 设计模式学习笔记 七、Proxy(代理模式)
- 【CDP-云设计模式】第4章,7.改写代理模式(Rewrite Proxy Pattern)
- 设计模式中代理(proxy)与委托(delegate)的语义区别
- JAVA设计模式(24) —代理(Proxy)模式
- [设计模式] 代理模式(Proxy)
- 设计模式之(Proxy)代理模式