1. 代理模式的原理与实现
在不改变原始类(或叫呗代理类)的情况下,通过带入代理类来给原始类附加功能,一般情况下,我们让代理类和原始类实现同样的接口,但是,如果原始类并没有定义接口,并且原始代码不是我们开发维护的,在这种情况下,我们可以通过让代理类继承原始类的方法来实现代理模式
2. 动态代理的原理与实现
静态代理需要争对每个类都创建一个代理类,并且每个代理类中的代码都有点像模板模式的“重复”代码,增加了维护成本和开发成本,对于静态代理存在的问题,就可以通过动态代理来解决。不是事先为每个原始类编写代理类,而是在运行的时候动态的创建原始类对应的代理类,然后在系统中用代理类替换掉原始类
3. 代理模式的应用场景
代理模式常用在业务系统中开发一些非功能需求,比如:监控,统计,鉴权,限流,事务,幂等,日志。将这些附加功能与业务功能解耦,放到代理类统一处理,让程序员之需要关注业务方面的开发,除此之外,代理模式还可以用在RPC ,缓存等应用场景中。
4. 代码示例
实现了一个静态代理
public class Poroy
{
// static void Main()
// {
// IProtuct proxyProtuct = new ProtuctProxy();
// proxyProtuct.Production("汽车");
// }
}
interface IProtuct
{
void Production(string protuct);
}
class Protuct : IProtuct
{
public void Production(string protuct)
{
Console.WriteLine($"{protuct}被生产");
}
}
class ProtuctProxy : IProtuct
{
private readonly Protuct _protuct = new Protuct();
public void Production(string protuct)
{
string methodName = nameof(Production);
PreProcess(methodName);
_protuct.Production(protuct);
PostProcess(methodName);
}
/// <summary>
/// 代理前置操作
/// </summary>
void PreProcess(string methodName)
{
Console.WriteLine($"{methodName}函数执行之前");
}
// 代理后置操作
void PostProcess(string methodName)
{
Console.WriteLine($"{methodName}函数执行之后");
}
}