简介
代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
当一个复杂对象的多份副本须存在时,代理模式可以结合享元模式以减少存储器用量。典型作法是创建一个复杂对象及多个代理者,每个代理者会引用到原本的复杂对象。而作用在代理者的运算会转送到原本对象。一旦所有的代理者都不存在时,复杂对象会被移除。
说白了就是中介,大学的时候打过暑假工的都应该知道,你要进电子厂打工,中间谁签的线?带你去电子厂,并且能让你进去的那个人就是代理。比如你要买东西,你自己不打算去,让别人帮你买,也是代理。
废话不多说,写个简单明了的例子,就行了。首先要抽象一个角色这个角色是抽象类或者接口都行。下面就写个接口
实现
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();
}
效果
来源
本文含有隐藏内容,请 开通VIP 后查看