本文來自《設計模式之禪》。原文用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級。 這個就是代理模式。
