设计模式-代理模式(Proxy)
应用场景:
领导都有秘书,一般会代理领导的部分职能角色,处理签字、报销、开会等任务。很多新人可能都只知道秘书的存在,毕竟每天与其打交道,不知道领导的存在。但是领导的的确确是真实存在的。
场景说明:
代理模式就是创建一个代理对象(秘书),用这个代理对象去代表真实对象。客户端得到这个对象以后,跟得到真实对象一样来使用。
当客户端操作代理对象时,实际上功能最终还是会由真实的对象来完成,只不过通过代理来操作而已。最终表现为,客户端操作代理,代理操作真实对象,对应上面的,员工都找秘书办事,秘书统一向领导汇报。
代理对象加载客户端和被代理的对象中间,我们就可以有一些变通,比如说,秘书会对所有事务筛选下,如果事情比较小,比较说请假签字,秘书可能直接就处理掉了,如果事情比较大,比如说部门预算,秘书就需要向领导汇报。
代理模式:为其它对象提供一种代理以控制对这个对象的访问。
代理模式的组成:
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)的更多相关文章
- 设计模式——代理模式(Proxy Pattern)
代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问. UML图: 模型设计: Subject类: package com.cnblog.clarck; /** * Subject 类 ...
- 设计模式 - 代理模式(proxy pattern) 未使用代理模式 具体解释
代理模式(proxy pattern) 未使用代理模式 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 部分代码參考: http://blog.csdn. ...
- 设计模式--代理模式Proxy(结构型)
一.代理模式 为其他对象提供一种代理以控制对这个对象的访问. 代理模式分为四种: 远程代理:为了一个对象在不同的地址空间提供局部代表.这样可以隐藏一个对象存在于不同地址空间的事实. 虚拟代理:根据需要 ...
- C#设计模式——代理模式(Proxy Pattern)
一.概述在软件开发中,有些对象由于创建成本高.访问时需要与其它进程交互等原因,直接访问会造成系统速度慢.复杂度增大等问题.这时可以使用代理模式,给系统增加一层间接层,通过间接层访问对象,从而达到隐藏系 ...
- 大话设计模式--代理模式 proxy
1. 代理模式: 为其他对象提供一种代理以控制这个对象的访问. 代理模式使用场合: a. 远程代理, 为一个对象在不同的地址空间提供局部代理,隐藏一个对象存在于不同地址空间的事实.如.net中WebS ...
- 23种设计模式--代理模式-Proxy
一.代理模式的介绍 代理模式我们脑袋里出现第一个词语就是代购,其实就是这样通过一个中间层这个中间成是属于什么都干什么都买得,俗称"百晓生",在平时得开发中我们经常会听到 ...
- 设计模式 -- 代理模式 (Proxy Pattern)
定义: 为其他对象提供一种代理以控制对这个对象的访问: 角色: 1,抽象主题类,(接口或者抽象类),抽象真实主题和代理的共有方法(如下Subject类): 2,具体实现的主题类,继承或者实现抽象主题类 ...
- 深入浅出设计模式——代理模式(Proxy Pattern)
模式动机在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称之为“代理”的第三者来实现间接引用.代理对象可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不能看到 ...
- 【转】设计模式(十一)代理模式Proxy(结构型)
设计模式(十一)代理模式Proxy(结构型) 1.概述 因为某个对象消耗太多资源,而且你的代码并不是每个逻辑路径都需要此对象, 你曾有过延迟创建对象的想法吗 ( if和else就是不同的两条逻辑路径) ...
随机推荐
- js 回车提交表单的实现
我们有时候希望回车键敲在文本框(input element)里来提交表单(form),但有时候又不希望如此.比如搜索行为,希望输入完关键词之后直接按回车键立即提交表单,而有些复杂表单,可能要避免回车键 ...
- Weblogic重启(转载)
1.用户名密码登录. 2.切换到weblogic的bin目录下: cd /user/local/weblogic/user_projects/domains/base_domain/bin/ 3.先停 ...
- python argparse模块解析命令行选项简单使用
argparse模块的解析命令行选项简单使用 util.py #!/usr/bin/env python # coding=utf-8 import argparse parser = argpars ...
- ruby 字符串学习笔记3
ascii转字符或者字符串转ascii "a".ord # => 97 "!".ord # => 33 "\n".ord # = ...
- 内存调试工具---valgrind
安装 1.到www.valgrind.org下载最新版valgrind-3.2.3.tar.bz2 2.解压安装包:tar –jxvf valgrind-3.2.3.tar.bz2 3.解压后生成目录 ...
- DedeTag Engine Create File False提示的种种原因及解决方法
DedeTag Engine Create File False提示的种种原因及解决方法 第一种情况:站点.文件夹权限不足造成无法建立文件 这种情况的出现,一方面可能是Apache设置的读写权限较严格 ...
- QT学习之路---信号槽
#include<QApplication> #include<QPushButton> int main(int argc,char *argv[]) { QApplicat ...
- [ActionScript 3.0] AS3.0 Loader加载子swf时是否需要指定新的应用程序域ApplicationDomain
实际应用中, Loader加载子swf时是否需要指定新的应用程序域ApplicationDomain,需要择情况而定. 1.如果在本地将项目位置添加到flashplayer受信任位置(上一篇文章所述) ...
- Ansible状态管理
转载自:http://xdays.me/ansible状态管理.html 简介 就像所有服务器批量管理工具(puppet有DSL,salt有state)一样,ansible也有自己的状态管理组件 ...
- chinapay
http://s.yanghao.org/program/viewdetail.php?i=71959 http://www.codeproject.com/csharp/biginteger.asp ...