一道猫和老鼠吵醒主人的笔试题(C#)

CSDN帖子:http://community.csdn.net/Expert/topic/3839/3839240.xml?temp=.607937

7.程序設計:貓大叫一聲,所有的老鼠都開始逃跑,主人被驚醒。(C#語言)
要求:

    1.要有聯動性,老鼠和主人的行為是被動的。
    2.考慮可擴展性,貓的叫聲可能引起其他聯動效應

     大部分答案都是使用的事件编程,我这里换了一下思路,使用观察着模式,用接口也实现了,因为考虑到第二个要求,即猫大叫也可能直接导致主人惊醒,所以Man也继承了ICatCatcher接口

源代码如下:

using System;

using System.Collections;

 

namespace test

{

 

     public interface ICatCatcher

     {

         void DoSth();

     }

 

     public interface ICatSubject

     {

         void RegesiterCatCatcher(ICatCatcher catCatcher);

         void Miao();

     }

 

     public interface IRatSubject

     {

         void RegesiterRatCatcher(IRatCatcher ratCatcher);

         void Run();

     }

 

     public interface IRatCatcher

     {

         void Wake();

     }

 

     public class Cat:ICatSubject

     {

         public Cat()

         {

         }

        

         private ArrayList catcherList = new ArrayList();

         public void RegesiterCatCatcher(ICatCatcher catcher)

         {

              catcherList.Add( catcher );

         }

 

         public void Miao()

         {

              Console.WriteLine( "Miao" );

 

              for(int i=0;i<catcherList.Count;i++)

              {

                   ICatCatcher catCatcher = (ICatCatcher)catcherList[i];

                   catCatcher.DoSth();

              }

         }

 

         [STAThread]

         public static void Main ()

         {

              Cat cat = new Cat();

             

              Rat[] rat = new Rat[10];

              for( int i=0;i<10;i++)

              {

                   rat[i] = new Rat(cat);

              }

 

              Man man = new Man(rat,cat);

 

              cat.Miao();

         }

     }

 

     public class Rat:ICatCatcher,IRatSubject

     {

         public Rat(ICatSubject catSub)

         {

              catSub.RegesiterCatCatcher(this);

         }

 

         public void DoSth()

         {

              Run();

         }

        

         private ArrayList ratcherList = new ArrayList();

         public void RegesiterRatCatcher(IRatCatcher catcher)

         {

              ratcherList.Add( catcher );

         }

 

         public void Run()

         {

              Console.WriteLine("Rat Run");

              for(int i=0;i<ratcherList.Count;i++)

              {

                   IRatCatcher ratCatcher = (IRatCatcher)ratcherList[i];

                   ratCatcher.Wake();

              }

         }

     }

 

     public class Man:ICatCatcher,IRatCatcher

     {

         public Man(IRatSubject[] ratSub,ICatSubject catSub)

         {

              for( int i=0 ;i<ratSub.Length;i++)

              {

                   ratSub[i].RegesiterRatCatcher(this);

              }

              catSub.RegesiterCatCatcher(this);

         }

 

         public void DoSth()

         {

              Console.WriteLine( "Cat bring on Wake" );

         }

        

         public void Wake()

         {

              Console.WriteLine( "Rats bring on Wake" );

         }

     }

}

        这里如果调试会出现一点点小问题,就是老鼠有很多,每个老鼠的Run都会Wake一下Man,所以感觉是主人被多次惊醒,其实这只是因为计算机总是按照顺序来执行程序的,能够模拟到这种效果应该已经算符合题意了

        这里如果调试会出现一点点小问题,就是老鼠有很多,每个老鼠的Run都会Wake一下Man,所以感觉是主人被多次惊醒,其实这只是因为计算机总是按照顺序来执行程序的,能够模拟到这种效果应该已经算符合题意了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值