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 (代理模式)
代理,指的就是一个角色代表另一个角色采取行动,就象生活中,一个红酒厂商,是不会直接把红酒零售客户的,都是通过代理来完成他的销售业务.而客户,也不用为了喝红酒而到处找工厂,他只要找到厂商在当地的代理就行 ...
随机推荐
- Linux Rsync备份服务介绍及部署守护进程模式
rsync介绍 rsync是一款开源的.快速的.多功能的.可实现全量及增量的本地或远程数据同步备份工具 在常驻模式(daemon mode)下,rsync默认监听TCP端口873,以原生rsync传输 ...
- JAVA通过Gearman实现MySQL到Redis的数据同步(异步复制)
MySQL到Redis数据复制方案 无论MySQL还是Redis,自身都带有数据同步的机制,像比较常用的 MySQL的Master/Slave模式 ,就是由Slave端分析Master的binlog来 ...
- NS3网络仿真(10): 解析以太网帧
快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载.但请保留作者信息 解析以太网帧的过程是构建以太网帧的逆过程,当我们接收到一个以太网帧时,仍然以上一节中的ARP帧为例 ...
- 独立安装WAMP
安装apache 获得apache安装软件: 建议去官网下载: www.apache.org 双击执行: 进入欢迎界面 点击"next"进入到协议界面 接收协议点击"ne ...
- 谈谈PBOC3.0中使用的国密SM2算法
转载请注明出处 http://blog.csdn.net/pony_maggie/article/details/39780825 作者:小马 一 知识准备 SM2是国密局推出的一种他们自己说具有自主 ...
- 输入url会发什什么
从输入url到页面加载完成发生了什么 整体来说有几个基本的点: 1.浏览器的地址栏输入url并按下回车 2.浏览器查找当前url是否存在缓存,并比较缓存是否过期 3.DNS解析url对应的IP 4.根 ...
- idea的快捷键
idea的快捷键大全 Alt+回车 导入包,自动修正 Ctrl+N 查找类 Ctrl+Shift+N 查找文件 Ctrl+Alt+L 格式化代码 Ctrl+Alt+O 优化导入的类和包 Alt+ ...
- Requests模块 HTTP for Humans
安装方式 $ pip install requests 基本GET请求(headers参数 和 parmas参数) 1.最基本的GET请求可以直接用get方法 response = requests. ...
- check the manual that corresponds to your MySQL server version for the right syntax处理方案
check the manual that corresponds to your MySQL server version for the right syntax:代码出现这样的bug,就要注意你 ...
- spring boot自定义starter
1.spring boot 项目中自定义jar包 2.项目目录 3.src/main/java 下面写自己的方法,重点是 resources 下面的文件,在resources下面新建文件夹名字为 ME ...