【23种设计模式】代理模式(Proxy Pattern) .Net Core实现
2023-09-11 14:14:50 时间
简介
代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
当一个复杂对象的多份副本须存在时,代理模式可以结合享元模式以减少存储器用量。典型作法是创建一个复杂对象及多个代理者,每个代理者会引用到原本的复杂对象。而作用在代理者的运算会转送到原本对象。一旦所有的代理者都不存在时,复杂对象会被移除。
说白了就是中介,大学的时候打过暑假工的都应该知道,你要进电子厂打工,中间谁签的线?带你去电子厂,并且能让你进去的那个人就是代理。比如你要买东西,你自己不打算去,让别人帮你买,也是代理。
废话不多说,写个简单明了的例子,就行了。首先要抽象一个角色这个角色是抽象类或者接口都行。下面就写个接口
组成
- 抽象角色:通过接口或抽象类声明真实角色实现的业务方法。
- 代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
- 真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用
实现
interface
public interface Workinerface
{
//工作类
void Work(string PersonName);
}
定义一个真实角色类
public class Peron : Workinerface
{
public void Work(string PersonName)
{
Console.WriteLine($"姓名为{PersonName}去了电子厂,做的工作是");
}
}
定义一个代理角色
public class Proxy : Workinerface
{
public PeronClass person;
public Proxy()
{
person = new PeronClass();
}
public void Work(string PersonName)
{
before();
person.Work(PersonName);
after();
}
public void before()
{
Console.WriteLine("真实角色执行前。。。。");
}public void after()
{
Console.WriteLine("真实角色执行后。。。。");
}
}
客户端调用
class Program
{
static void Main(string[] args)
{
Workinerface work = new Proxy();
work.Work("张三");
Console.Read();
}
效果
代理模式就是这样实现的,是不是很简单。(其实代理模式的好处就是,在真实角色没有执行自己的方法之前和之后可以做一些操作)
改进
但是后来我又想了想,如果一个代理不止代理一种类型,于是我就改进了一下:
public interface Workinerface
{
//工作类
void Run(string PersonName);
}
public class PeronClass : Workinerface
{
public void Run(string PersonName)
{
Console.WriteLine($"姓名为{PersonName}去了电子厂");
}
}
public class RentHouse : Workinerface
{
public void Run(string PersonName)
{
Console.WriteLine($"姓名为{PersonName}租了房");
}
}
public class Proxy<T> : Workinerface where T : Workinerface, new()
{
public T t;
public Proxy()
{
t = new T();
}
public void Run(string PersonName)
{
before();
t.Run(PersonName);
after();
}
public void before()
{
Console.WriteLine("真实角色执行前。。。。");
}public void after()
{
Console.WriteLine("真实角色执行后。。。。");
}
客户端调用
class Program
{
static void Main(string[] args)
{
Workinerface work = new Proxy<PeronClass>();
Workinerface house = new Proxy<RentHouse>();
work.Run("张三");
house.Run("李四");
Console.Read();
}
效果
优点
- 职责清晰,真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。
- 代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了中介的作用和保护了目标对象的作用。
- 高扩展性
来源
相关文章
- 使用 Visual Studio 部署 .NET Core 应用 ——.Net Core 部署到SUSE Linux Enterprise Server 12 SP2 64 位(GNOME 版本3.20.2)
- 使用 Visual Studio 部署 .NET Core 应用 ——.Net Core 部署到Ubuntu 16.04
- C#.Net实体代码生成工具(EntitysCodeGenerate)的使用及.NET中的ORM实现
- ASP.NET Core WebApi+EF Core入门到实战演练
- .NET Core开源Quartz.Net作业调度框架实战演练
- .NET 开源Protobuf-net从入门到精通
- .NET开源Protobuf-net组件修炼手册
- asp.net MVC 的处理流程
- C#.NET常见问题(FAQ)-如何让TabControl可以动态增加或删除
- Mysql分页查询通用存储过程 - 阿影的黄金时代 - 博客频道 - CSDN.NET
- Asp.Net Web API 2第十七课——Creating an OData Endpoint in ASP.NET Web API 2(OData终结点)
- Asp.Net Web API 2第十三课——ASP.NET Web API中的JSON和XML序列化
- 重新整理 .net core 实践篇————配置系统——军令(命令行)[六]
- asp.net core 读取Appsettings.json 配置文件
- 重新整理 .net core 实践篇——— filter[四十四]
- 《ASP.NET Core 3框架揭秘》售后支持
- 【原创】开源Math.NET基础数学类库使用(09)相关数论函数使用
- ASP.NET Razor - C# 循环和数组
- 【.net】获取网页CDM的下载链接的地址
- ASP.NET 使用Ajax
- AC上百度网盘做了策略可以下载不能上传 但是网页访问不了出现NET:ERR_CERT_AUTHORITY_INVALID 错误
- .Net程序猿乐Android发展---(1)环境结构
- FastReport .NET 2022.3.6-新版Crack
- Toolwtech Graphics3D.NET 2.0.x专业版Crack
- 【.Net实用方法总结】 整理并总结.NET 中的 System.IO.Pipelines(管道)
- 关于ASP.net开启身份验证时集成的托管管道模式下不适用的 ASP.NET 设置