一、定义
定义:为其他对象提供一种代理以控制对这个对象的访问
在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。
二、结构
代理模式一般会有三个角色:
抽象角色(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设计模式之目录