代理模式:在真实类不方便修改、管理不了它等情况下,可以通过代理对它进行维护
代理模式不是为了增加行为,而是为了控制行为
架构设计思想:任何问题,都可以通过添加一层来解决
先来一个简单的代理模式例子,下面代码中,有一个Mid类和它的代理类MidProxy
Ihero接口
public interface IHero
{
void ClickQ();
void ClickW();
void ClickE();
void ClickR();
}
Mid
public class Mid:IHero
{
public Mid()
{
Console.WriteLine("实例化了一次");
}
public void ClickQ()
{
Console.WriteLine("释放了一个Q技能");
}
public void ClickW()
{
Console.WriteLine("释放了一个W技能");
}
public void ClickE()
{
Console.WriteLine("释放了一个E技能");
}
public void ClickR()
{
Console.WriteLine("释放了一个R技能");
}
}
MidProxy
public class MidProxy:IHero
{
private static Mid _mid = new Mid();
public void ClickQ()
{
_mid.ClickQ();
}
public void ClickW()
{
_mid.ClickW();
}
public void ClickE()
{
_mid.ClickE();
}
public void ClickR()
{
_mid.ClickR();
}
}
调用
IHero hero = new MidProxy();
hero.ClickQ();
hero.ClickW();
hero.ClickE();
hero.ClickR();
结果:
通过上面,还可能不能太好的理解代理类,其实代理类在我的理解中,就是当你对一个类不能进行直接的修改的时候,通过一个第三方,可以给他进行更多的约束控制,或者添加一些其他功能,比如下面说一下 单例代理,以上面代码为例,如果我的Mid已经不能进行修改了,但是我还想让他实现单例,就按照下面的方法来做
对MidProxy进行修改
public class MidProxy:IHero
{
private static Mid _mid =null;
private static object _lock = new object();
public MidProxy()
{
if (_mid == null)
{
lock (_lock)
{
if (_mid == null)
{
_mid = new Mid();
}
}
}
}
public void ClickQ()
{
_mid.ClickQ();
}
public void ClickW()
{
_mid.ClickW();
}
public void ClickE()
{
_mid.ClickE();
}
public void ClickR()
{
_mid.ClickR();
}
}
调用的时候。多new几次
IHero hero1 = new MidProxy();
IHero hero2 = new MidProxy();
IHero hero = new MidProxy();
hero.ClickQ();
hero.ClickW();
hero.ClickE();
hero.ClickR();
看看结果:
这就实现了,在不修改Mid的情况下实现了单例效果