一、描述
想在访问一个类时做一些控制,比如有个歌手类,里面就一个方法-唱歌,我们要调用这个方法前需要判断下我们给的钱够不够,那么这个判断方法我不想加在唱歌的方法里面,也不想加在客户端,那么就可以用代理模式了。
二、优劣势
优点: 1、职责清晰。 2、高扩展性。 3、智能化。
缺点: 1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。 2、实现代理模式需要额外的工作,有些代理模式的实现非常复杂。
三、需求
有个明星,他有2个功能,一个是唱歌,一个是拍电影,根据给的钱够不够决定要不要答应做这件事。
四、不使用设计模式
都不考虑设计了,直接撸代码。
2个类,
IStar.cs -明星基类
KingStar.cs --明星实现类
//明星基类
public interface IStar
{
//唱歌
void SingSong(int money);
//拍电影
void Movie(int money);
}
//明星实现类
public class KingStar : IStar
{
public void Movie(int money)
{
Debug.Log("去拍电影");
}
public void SingSong(int money)
{
Debug.Log("去演出唱歌");
}
}
//客户端调用
public static void main(string[] args)
{
IStar star = new KingStar();
int money = 99;
if (money>10000)
{
star.SingSong(money);
}
else
{
Debug.Log("钱太少了请不动");
}
}
运行结果
小结:在客户端调用唱歌时得进行钱是否给够,导致客户端调用不方便,直接写在明星类里也不方便,明星并不会处理这些,只会唱歌演戏不会谈判,我就可以,因为我全能。
五、使用设计模式
我们引入代理模式,代理模式其实就相当于一个经纪人,来帮明星处理是否钱够不够演出的问题,经纪人类必须继承明星类的基类,为了统一唱歌和拍电影接口。
2个类,
IStar.cs -明星基类
KingStar.cs --明星实现类
JingJiRenStar.cs --经纪人类(代理)
//明星基类
public interface IStar
{
//唱歌
void SingSong(int money);
//拍电影
void Movie(int money);
}
//明星实现类
public class KingStar : IStar
{
public void Movie(int money)
{
Debug.Log("去拍电影");
}
public void SingSong(int money)
{
Debug.Log("去演出唱歌");
}
}
//经纪人代理类
public class ProxyStar: IStar
{
private IStar star;//所代理的明星对象
public ProxyStar(IStar s)
{
star = s;
}
public void Movie(int money)
{
if (money>10000)
{
Debug.Log("去拍电影");
}
else
{
Debug.Log("不好意思"+money+"不够我家艺人去拍电影");
}
}
public void SingSong(int money)
{
if (money > 10000)
{
Debug.Log("去演出唱歌");
}
else
{
Debug.Log("不好意思" + money + "不够我家去演出唱歌");
}
}
}
//客户端调用
public static void main(string[] args)
{
IStar star = new KingStar();
ProxyStar proxyStar= new ProxyStar(star);
int money = 9999;
ProxyStar.Movie(money);
}
运行结果
小结:我们通过引入代理模式,把原来的判断条件移到了代理类里面,再由代理类去决定是否触发明星类是否答应,特别形象的展示了代理的关系。
六、设计图
通过学习,我们了解到了代理模式的应用,我们把刚刚的实现方式画出来。
//ToDo 画图......
七、总结
觉得有用就留下评论吧^-^