Head First设计模式之代理模式

时间:2022-08-11 22:25:44

一、定义

定义:为其他对象提供一种代理以控制对这个对象的访问

在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。

二、结构

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设计模式之目录