Head First设计模式之代理模式
一、定义
定义:为其他对象提供一种代理以控制对这个对象的访问
在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。
二、结构

代理模式一般会有三个角色:
抽象角色(Subject):指代理角色和真实角色对外提供的公共方法,一般为一个接口
真实角色(RealSubject):需要实现抽象角色接口,定义了真实角色所要实现的业务逻辑,以便供代理角色调用。
代理角色(Proxy):需要实现抽象角色接口,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
三、实现
1.静态代理
namespace DesignPatterns.Proxy
{
class Program
{
static void Main(string[] args)
{
RealStar star = new RealStar();
Agent agent = new Agent(star);
agent.DiscussCooperation();
agent.SignContract();
agent.PlayRoleInMovie();
agent.CollectMoney();
}
} public interface IMovieStar
{
/// <summary>
/// 找电影合作
/// </summary>
void DiscussCooperation();
/// <summary>
/// 签合同
/// </summary>
void SignContract();
/// <summary>
/// 出演电影角色
/// </summary>
void PlayRoleInMovie();
/// <summary>
/// 收演出费
/// </summary>
void CollectMoney();
} public class RealStar : IMovieStar
{
public void DiscussCooperation()
{
Console.WriteLine("星爷找电影合作");
} public void SignContract()
{ Console.WriteLine("星爷签合同");
} public void PlayRoleInMovie()
{ Console.WriteLine("星爷演出");
} public void CollectMoney()
{ Console.WriteLine("星爷收费");
}
} public class Agent : IMovieStar
{
private IMovieStar _star;
public Agent(IMovieStar star)
{
_star = star;
} public void DiscussCooperation()
{
Console.WriteLine("经纪人找电影合作");
} public void SignContract()
{ Console.WriteLine("经纪人签合同");
} public void PlayRoleInMovie()
{
_star.PlayRoleInMovie();
} public void CollectMoney()
{
Console.WriteLine("经纪人收费");
}
} }
四、使用场景
按职责来划分,通常有以下使用场景:
1、远程代理。 2、虚拟代理。 3、Copy-on-Write 代理。 4、保护(Protect or Access)代理。 5、Cache代理。 6、防火墙(Firewall)代理。 7、同步化(Synchronization)代理。 8、智能引用(Smart Reference)代理。
五、优缺点
优点:
1、代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度;
2、代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了保护目标对象的作用。
缺点:
1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。
2、增加了代码维护的复杂度,实现代理模式需要额外的工作,有些代理模式的实现非常复杂。
欢迎阅读本系列文章:Head First设计模式之目录
Head First设计模式之代理模式的更多相关文章
- C#设计模式(13)——代理模式(Proxy Pattern)
一.引言 在软件开发过程中,有些对象有时候会由于网络或其他的障碍,以至于不能够或者不能直接访问到这些对象,如果直接访问对象给系统带来不必要的复杂性,这时候可以在客户端和目标对象之间增加一层中间层,让代 ...
- 乐在其中设计模式(C#) - 代理模式(Proxy Pattern)
原文:乐在其中设计模式(C#) - 代理模式(Proxy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 代理模式(Proxy Pattern) 作者:webabcd 介绍 为 ...
- Java设计模式之代理模式(静态代理和JDK、CGLib动态代理)以及应用场景
我做了个例子 ,需要可以下载源码:代理模式 1.前言: Spring 的AOP 面向切面编程,是通过动态代理实现的, 由两部分组成:(a) 如果有接口的话 通过 JDK 接口级别的代理 (b) 如果没 ...
- 设计模式之代理模式之二(Proxy)
from://http://www.cnblogs.com/xwdreamer/archive/2012/05/23/2515306.html 设计模式之代理模式之二(Proxy) 0.前言 在前 ...
- 夜话JAVA设计模式之代理模式(Proxy)
代理模式定义:为另一个对象提供一个替身或者占位符以控制对这个对象的访问.---<Head First 设计模式> 代理模式换句话说就是给某一个对象创建一个代理对象,由这个代理对象控制对原对 ...
- GOF23设计模式之代理模式
GOF23设计模式之代理模式 核心作用:通过代理,控制对对象的访问.可以详细控制访问某个(某类)对象的方法,在调用这个方法前做前置处理,调用这个方法后做后置处理(即:AOP的微观实现) AOP(Asp ...
- C#设计模式:代理模式(Proxy Pattern)
一,什么是C#设计模式? 代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问 二,代码如下: using System; using System.Collectio ...
- js设计模式——1.代理模式
js设计模式——1.代理模式 以下是代码示例 /*js设计模式——代理模式*/ class ReadImg { constructor(fileName) { this.fileName = file ...
- java设计模式6——代理模式
java设计模式6--代理模式 1.代理模式介绍: 1.1.为什么要学习代理模式?因为这就是Spring Aop的底层!(SpringAop 和 SpringMvc) 1.2.代理模式的分类: 静态代 ...
- php设计模式 Proxy (代理模式)
代理,指的就是一个角色代表另一个角色采取行动,就象生活中,一个红酒厂商,是不会直接把红酒零售客户的,都是通过代理来完成他的销售业务.而客户,也不用为了喝红酒而到处找工厂,他只要找到厂商在当地的代理就行 ...
随机推荐
- 实战-CentOS6.8配置nfs服务
如题 #服务端:请自行配置yum源 命令操作:yum install nfs-utils rpcbind #配置文件编辑:vi /etc/exports /data 0.0.0.0 (rw,sync, ...
- UVA12493 - Stars(求1-N与N互质的个数)欧拉函数
Sample Input 3 4 5 18 36 360 2147483647 Sample Output 1 1 2 3 6 48 1073741823 题目链接:https://uva.onlin ...
- C#线程等待句柄
相互排斥对象 Mutex private Mutex m = new Mutex(); public void Method(){ m.WaitOne(); //运行操作 m.ReleaseMutex ...
- CCFlow最近在山东济南总部举行组团培训活动,有參加的能够报名
最近.CCFlow将会组织培训,由总设计师--周朋先生亲自授课. 行程 培训内容 第一天 ccflow的概述功能简 ...
- cocos2dx中关于Action动作的相关API的具体介绍
//CCMoveBy 创建一个移动的动作 //參数1:移动到目标坐标所需的时间 //參数2:目标坐标 //支持reverse 能够获取其反向动作 //CCMoveTo 一样的 //CCAct ...
- 【SqlServer系列】语法定义符号解析
1 概述 在数据库函数定义中,经常用到这些符号:<>,::=,[],{},|,..,(),!! .这篇文章简要概述这些符号. 2 具体内容 2.1 <> < ...
- 增加tomcat的缓存
起因是我做了一个批量压缩图片的功能,在服务器上跑这个功能的时候,发现服务器有警告.警告的内容大概如下. XX.... to the cache because there was insuffic ...
- jquery技巧小结
由于主要还是负责后端,所以前端很多东西都不熟悉,jQuery作为web开发必备技能,有很多知识点,老是记不清楚,所以在这边整理一下. 1.加载页面后执行 $(function(){ //程序段 }) ...
- git忽略文件
.gitignore文件配置 ###################### # Project Specific ###################### /src/main/webapp/dis ...
- Netty学习笔记(一):接收nodejs模拟表单上传的文件
好久不写博客了,也好久不写代码了,这两天临时遇上一个事情,觉得不难,加上觉得手有些生,就动手做了一下,结果遇上了不少坑,有新坑,有老坑,痛苦无比,现在总算差不多了,赶紧记录下来,希望以后不再重复这种痛 ...