定义: 给某一个对象提供一个代理,并由代理对象控制对原对象的引用。代理模式的英文叫做Proxy或Surrogate。
代理模式包含如下角色:
Subject(抽象主题角色):它声明了真实主题和代理主题的共同接口,这样一来在任何使用真实主题的地方都可以使用代理主题,客户端通常需要针对抽象主题角色进行编程。
RealSubject(真实主题角色):它定义了代理角色所代表的真实对象,在真实主题角色中实现了真实的业务操作,客户端可以通过代理主题角色间接调用真实主题角色中定义的操作。
Proxy(代理主题角色):它包含了对真实主题的引用,从而可以在任何时候操作真实主题对象;提供了一个与真实主题角色相同的接口,在任何时候都可以替代真实主题;控制对真实主题的使用,负责在需要的时候创建和删除真实主题对象,并对真实主题对象的使用加以约束。通常,在代理主题角色中,客户端在调用所引用的真实主题操作之前或之后还需要执行其他操作,而不仅仅是单纯调用真实主题对象中的操作。
按照代理的创建时期,代理类可以分为两种:
静态:由程序员创建代理类或特定工具自动生成源代码再对其编译。在程序运行前代理类的 .class文件就已经存在了。
动态:在程序运行时运用反射机制动态创建而成。
ps:静态代理与动态代理都能实现相同的功能,动态代理只是对类做了进一步抽象和封装,使其复用性和易用性得到进一步提升
举例
代购一部手机
- 抽象主题类
public abstract class Subject
{
public abstract void BuyPhone();
}
- 真实主题类
public class RealSubject : Subject
{
public override void BuyPhone()
{
Console.WriteLine("买一部手机");
}
}
- 代理主题类
public class Proxy : Subject
{
private RealSubject realSubject = new RealSubject();public override void BuyPhone()
{
//调用真实主题角色核心方法之前
Console.WriteLine("虚报高价");//调用真实主题角色核心方法
realSubject.BuyPhone();//调用真实主题角色核心方法之后
Console.WriteLine("赚个差价");
}
}
- 客户类
class Program
{
static void Main(string[] args)
{
Proxy proxy = new Proxy();
proxy.BuyPhone();
}
}
总结:抽象主题类定义核心方法,抽象主题类和代理主题类均继承该抽象类,在真实主题类中实现该方法的具体操作,在代理主题类中创建一个真实主题类对象,在实现抽象类方法时调用真实主题类的实现方法,同时可以加上新增的一些方法。