应用场景:

领导都有秘书,一般会代理领导的部分职能角色,处理签字、报销、开会等任务。很多新人可能都只知道秘书的存在,毕竟每天与其打交道,不知道领导的存在。但是领导的的确确是真实存在的。

场景说明:

代理模式就是创建一个代理对象(秘书),用这个代理对象去代表真实对象。客户端得到这个对象以后,跟得到真实对象一样来使用。

当客户端操作代理对象时,实际上功能最终还是会由真实的对象来完成,只不过通过代理来操作而已。最终表现为,客户端操作代理,代理操作真实对象,对应上面的,员工都找秘书办事,秘书统一向领导汇报。

代理对象加载客户端和被代理的对象中间,我们就可以有一些变通,比如说,秘书会对所有事务筛选下,如果事情比较小,比较说请假签字,秘书可能直接就处理掉了,如果事情比较大,比如说部门预算,秘书就需要向领导汇报。

代理模式:为其它对象提供一种代理以控制对这个对象的访问。

代理模式的组成:

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)的更多相关文章

  1. 设计模式——代理模式(Proxy Pattern)

    代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问. UML图: 模型设计: Subject类: package com.cnblog.clarck; /** * Subject 类 ...

  2. 设计模式 - 代理模式(proxy pattern) 未使用代理模式 具体解释

    代理模式(proxy pattern) 未使用代理模式 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 部分代码參考: http://blog.csdn. ...

  3. 设计模式--代理模式Proxy(结构型)

    一.代理模式 为其他对象提供一种代理以控制对这个对象的访问. 代理模式分为四种: 远程代理:为了一个对象在不同的地址空间提供局部代表.这样可以隐藏一个对象存在于不同地址空间的事实. 虚拟代理:根据需要 ...

  4. C#设计模式——代理模式(Proxy Pattern)

    一.概述在软件开发中,有些对象由于创建成本高.访问时需要与其它进程交互等原因,直接访问会造成系统速度慢.复杂度增大等问题.这时可以使用代理模式,给系统增加一层间接层,通过间接层访问对象,从而达到隐藏系 ...

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

    1. 代理模式: 为其他对象提供一种代理以控制这个对象的访问. 代理模式使用场合: a. 远程代理, 为一个对象在不同的地址空间提供局部代理,隐藏一个对象存在于不同地址空间的事实.如.net中WebS ...

  6. 23种设计模式--代理模式-Proxy

    一.代理模式的介绍       代理模式我们脑袋里出现第一个词语就是代购,其实就是这样通过一个中间层这个中间成是属于什么都干什么都买得,俗称"百晓生",在平时得开发中我们经常会听到 ...

  7. 设计模式 -- 代理模式 (Proxy Pattern)

    定义: 为其他对象提供一种代理以控制对这个对象的访问: 角色: 1,抽象主题类,(接口或者抽象类),抽象真实主题和代理的共有方法(如下Subject类): 2,具体实现的主题类,继承或者实现抽象主题类 ...

  8. 深入浅出设计模式——代理模式(Proxy Pattern)

    模式动机在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称之为“代理”的第三者来实现间接引用.代理对象可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不能看到 ...

  9. 【转】设计模式(十一)代理模式Proxy(结构型)

    设计模式(十一)代理模式Proxy(结构型) 1.概述 因为某个对象消耗太多资源,而且你的代码并不是每个逻辑路径都需要此对象, 你曾有过延迟创建对象的想法吗 ( if和else就是不同的两条逻辑路径) ...

随机推荐

  1. 如何刪除GitHub中的repository

    如何刪除一github中的repository,這本該是個非常簡單的操作,可一開始搜的時候,有不少文章比較含糊.這裡就記錄下來吧. 1.訪問https://github.com/settings/pr ...

  2. Axis2的下载和安装

    Axis2是一套崭新的WebService引擎,该版本是对Axis1.x重新设计的产物.Axis2不仅支持SOAP1.1和SOAP1.2,还集成了非常流行的REST WebService,同时还支持S ...

  3. Android 开发中常用 ADB 命令总结

    adb 的全称为 Android Debug Bridge,就是起到调试桥的作用.通过 adb 我们可以在 Eclipse 中方便通过 DDMS 来调试 Android 程序,说白了就是 debug ...

  4. distinct 多个字段

    select distinct ID,AA,BB from tName与select distinct ID from tName有什么区别??第一种情况,distinct会不会影响AA,或者BB字段 ...

  5. Quartz CronTrigger配置

    关于cron表达式(来自网络): Cron 表达式包括以下 7 个字段: 秒 分 小时 月内日期 月 周内日期 年(可选字段) 特殊字符 Cron 触发器利用一系列特殊字符,如下所示: 反斜线(/)字 ...

  6. (medium)LeetCode 238.Product of Array Except Self

    Given an array of n integers where n > 1, nums, return an array output such that output[i] is equ ...

  7. vs2013 ie10

    http://blog.163.com/qimo601@126/blog/static/1582209320143354446462/     @ECHO OFF   :IE10HACK  REG A ...

  8. MySQL的循环语句使用总结

    REPEAT-UNTIL循环 [loopname]:REPEAT commands; UNTIL condition END REPEAT [loopname]; 在这种循环里,关键字repeat和u ...

  9. Spring的java.lang.IndexOutOfBoundsException: Remember that ordinal parameters are 1-based!异常处理方法

    使用Spring提供的模板类HibernateDaoSupport,如果单纯的使用'命名参数'的形式编写HQL语句如: public class UserDaoImpl extends Hiberna ...

  10. Integer cache

    View.findViewById采用深度遍历,找到第一个匹配的控件 Integer Cache public static void testIntegerCache() { Class cache ...