设计模式之代理模式

本文来自《设计模式之禅》。原文用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级。 这个就是代理模式。

 
 
 
posted @ 2012-05-24 23:00  xiaoshiyilang  阅读(1791)  评论(9编辑  收藏  举报