故事与模式(2)

      公元2054,30界世界杯亚洲区外围赛中,中国队的最后一场比赛对韩国,只有战胜对手才能出线。 自从米卢执教中国队以来,已经有五十多年中国队再也没尝到过进军世界杯的滋味,而且恐韩症已经染了七十年之久.很多球迷从黑发人看成了白发人,但是还有部分的痴心球迷关注着这场比赛.
痴心球迷

足球比赛

        static void Main(string[] args)
        {
            FootballMatch match 
= new FootballMatch();
            Audience justin 
= new Audience("justin");
            Audience terry 
= new Audience("terry");
            match.Observers.Add(justin);
            match.Observers.Add(terry);
            match.Play();
        }

    足球比赛中可能不只球员,还有天气,裁判等各要素,需要让足球比赛和它的观察者们偶合度更小,我们尝试着用委托和事件来重构它.
足球比赛
      任何关注足球比赛的人或者事都可以通过注册事件的方式来关注它,偶合度更加松散,意味着更加灵活,这不正是ISP(接口隔离原则)所提倡的嘛:一个类对另外一个类的依赖性应当是建立在最小接口上的。下面代码中不但有足球比赛中的观众,还有天气.
     
        static void Main(string[] args)
        {
            FootballMatch match 
= new FootballMatch();
            Audience justin 
= new Audience("justin");
            Audience terry 
= new Audience("terry");
            match.BeforeMatch 
+= new MatchHandler(match_BeforeMatch);
            match.BeforeMatch 
+=new MatchHandler(justin.Excited);
            match.BeforeMatch 
+=new MatchHandler(terry.nervous);
            match.AfterMatch 
+=new MatchHandlerEnd(justin.KnowResult);
            match.AfterMatch 
+=new MatchHandlerEnd(terry.KnowResult);
            match.AfterMatch 
+= new MatchHandlerEnd(match_AfterMatch);
            match.Play();
        }

        
static void match_AfterMatch(bool isWin)
        {
            
if (isWin)
            {
                Console.WriteLine(
"Snow..");
            }
            
else
            {
                Console.WriteLine(
"Rain..");
            }
        }

        
static void match_BeforeMatch()
        {
            Console.WriteLine(
"wind.");
        }
    通过带参数的委托可以实现中国队赢球或输球后不同的结果.

   当中国队输球了,愤怒的观众把电视机砸了,天空也开始下雨了.
   你也可以任意添加观察者到这场足球比赛里,只要符合所定义委托的规定就行.
   僵化的代码需要重构,落后的中国足球体制是不是也需要重构呢?
posted on 2008-03-10 17:36  雾里清风  阅读(1512)  评论(7编辑  收藏  举报