设计模式之代理模式
本文来自《设计模式之禅》。原文用java实现,这里改用c#来实现。
最近感觉很无聊,于是开始玩游戏消磨时间。在这段时间体会到网络游戏的苦与乐。参与家族攻城,胜利后那叫一个乐啊,感觉自己像一个狂暴战士,无往不胜。那苦是什么呢?就是升级,为了升一级,就要开始杀怪,自己做任务。变态的是那个游戏对外挂管理的非常的严格,基本上出个外挂,没两天就开始封号,不敢用。升级基本靠自己手打。接下来我们用架构的方式记录下这段经历。
游戏过程如上图所示。
首先定义一个IGamePlayer接口,是所有喜欢网络游戏的玩家的规范,然后定义一个具体的实现类GamePlayer,实现每个游戏玩家为了玩游戏要执行的功能。实现代码如下。
public interface IGamePlayer { void Login(string userName,string passWord); void KillBoss(); void UpGrade(); }
非常的简单,定义了三个方法,分别是登陆,打怪和升级。
其实现类代码清单如下:
public class GamePlayer : IGamePlayer { private string name = ""; public GamePlayer(string name) { this.name = name; } public void Login(string userName, string password) { Console.WriteLine(this.name+"login the system successfully "); } public void KillBoss() { Console.WriteLine(this.name + "is killing boss now"); } public void UpGrade() { Console.WriteLine(this.name + "has upgraded successfully "); }
}
场景类实现如下:
class Program { static void Main(string[] args) { IGamePlayer player = new GamePlayer("zhang san"); Console.WriteLine("The start time is {0}",DateTime.Now); player.Login("zhang san","password"); player.KillBoss(); player.UpGrade(); Console.WriteLine("The start time is {0}",DateTime.Now); Console.Read(); } }
运行结果是我们想要的,记录着我们打怪升级的过程。但是人类对于喜悦是“趋利”性的,每个人都想happy,都不想让苦难靠近,要想获得幸福,苦难是在所难免的。游戏时间长了,腰酸背痛,眼睛干涩。。。。。。。
怎么办?我们想玩游戏,但是不想经历打怪的痛苦,又想获得升级的快乐。有办法,现在游戏代练的公司很多,找他们。于是我们让他们去帮我们打怪。
我们来修改一下类图。
在类图中我们增加了一个GamePlayerProxy类来代表游戏代练者,它也不能有作弊的方法啊。游戏代练者也是手动打怪,同样需要继承IGamePlayer接口。其实现code如下:
public class GamePlayerProxy : IGamePlayer { private IGamePlayer gamePlayer = null; public GamePlayerProxy(IGamePlayer gamePlayer) { this.gamePlayer = gamePlayer; } public void Login(string userName, string password) { this.gamePlayer.Login(userName,password); } public void KillBoss() { this.gamePlayer.KillBoss(); } public void UpGrade() { this.gamePlayer.UpGrade(); } }
改进后的场景类code如下:
class Program { static void Main(string[] args) { IGamePlayer player = new GamePlayer("zhang san"); IGamePlayer proxy = new GamePlayerProxy(player); Console.WriteLine("The start time is {0}", DateTime.Now); proxy.Login("zhang san", "password"); proxy.KillBoss(); proxy.UpGrade(); Console.Read(); } }
运行结构也是我们所期望的。
你应该发觉了,你的游戏已经在升级,有人帮你干活了(当然你也付出了money)。终于升到120级。 这个就是代理模式。
即使是骗,也要勤学苦练。