一道猫和老鼠吵醒主人的笔试题(C#)
程序設計:貓大叫一聲,所有的老鼠都開始逃跑,主人被驚醒。(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;
catCatcher.DoSth();
}
}
[STAThread]
public static void Main()
{
Cat cat = new Cat();
Rat[] rat = new Rat[10];
for( int i=0;i<10;i++)
{
rat = 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;
ratCatcher.Wake();
}
}
}
public class Man:ICatCatcher,IRatCatcher
{
public Man(IRatSubject[] ratSub,ICatSubject catSub)
{
for( int i=0 ;i<ratSub.Length;i++)
{
ratSub.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,所以感觉是主人被多次惊醒,其实这只是因为计算机总是按照顺序来执行程序的,能够模拟到这种效果应该已经算符合题意了
要求:
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;
catCatcher.DoSth();
}
}
[STAThread]
public static void Main()
{
Cat cat = new Cat();
Rat[] rat = new Rat[10];
for( int i=0;i<10;i++)
{
rat = 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;
ratCatcher.Wake();
}
}
}
public class Man:ICatCatcher,IRatCatcher
{
public Man(IRatSubject[] ratSub,ICatSubject catSub)
{
for( int i=0 ;i<ratSub.Length;i++)
{
ratSub.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,所以感觉是主人被多次惊醒,其实这只是因为计算机总是按照顺序来执行程序的,能够模拟到这种效果应该已经算符合题意了
作者:Bober Song
出处:http://bober.cnblogs.com/
CARE健康网: http://www.aicareyou.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
出处:http://bober.cnblogs.com/
CARE健康网: http://www.aicareyou.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。