您的位置:首页 > 其它

设计模式-结构型模式:代理模式 Proxy

2016-12-12 17:29 901 查看
代理模式:在真实类不方便修改、管理不了它等情况下,可以通过代理对它进行维护

代理模式不是为了增加行为,而是为了控制行为

架构设计思想:任何问题,都可以通过添加一层来解决

先来一个简单的代理模式例子,下面代码中,有一个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的情况下实现了单例效果
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: