semye-静心

积累,点点滴滴
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

猫与老鼠(经典面试)

Posted on 2007-02-05 12:33  semye  阅读(767)  评论(2编辑  收藏  举报
   程序设计: 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。(C#语言)要求: 
1.
要有联动性,老鼠和主人的行为是被动的。

2.考虑可扩展性,猫的叫声可能引起其他联动效应。

 要点:
1. 联动效果,运行代码只要执行Cat.Cryed()方法。
2. 对老鼠和主人进行抽象
  评分标准: 
<1>.构造出Cat、Mouse、Master三个类,并能使程序运行(2分)         
<2>从Mouse和Master中提取抽象(5分)
<3>联动效应,只要执行Cat.Cryed()就可以使老鼠逃跑,主人惊醒。(3分)
出题者给出的答案……
  

  1
  6    public interface Observer
  7    {
  8        void Response();    //观察者的响应,如是老鼠见到猫的反映
  9    }

 10    public interface Subject
 11    {
 12        void AimAt(Observer obs);  //针对哪些观察者,这里指猫的要扑捉的对象---老鼠
 13    }

 14    public class Mouse : Observer
 15    {
 16        private string name;
 17        public Mouse(string name, Subject subj)
 18        {           
 19            this.name = name;
 20            subj.AimAt(this);
 21        }

 22        
 23        public void Response()
 24        {
 25            Console.WriteLine(name + " attempt to escape!");
 26        }

 27    }

 28    public class Master : Observer
 29    {   
 30        public Master(Subject subj)
 31        {           
 32            subj.AimAt(this);
 33        }

 34        
 35        public void Response()
 36        {
 37            Console.WriteLine("Host waken!");
 38        }
  
 39    }

 40 
 41    public class Cat : Subject
 42    {
 43        private ArrayList observers;
 44        public Cat()
 45        {   
 46            this.observers = new ArrayList();
 47        }

 48        public void AimAt(Observer obs)
 49        {
 50            this.observers.Add(obs);
 51        }

 52        public void Cry()
 53        {
 54            Console.WriteLine("Cat cryed!");
 55            foreach (Observer obs in this.observers)
 56            {
 57                obs.Response();
 58            }

 59        }

 60    }

 61    class MainClass
 62    {       
 63        static void Main(string[] args)
 64        {
 65            Cat cat = new Cat();
 66            Mouse mouse1 = new Mouse("mouse1", cat);
 67            Mouse mouse2 = new Mouse("mouse2", cat);
 68            Master master = new Master(cat);
 69            cat.Cry();
 70        }

 71    }

 72
 73//---------------------------------------------------------------------------------------------
 74设计方法二: 使用event -- delegate设计..
 75    public delegate void SubEventHandler();
 76    public abstract class Subject
 77    {
 78        public event SubEventHandler SubEvent;
 79        protected void FireAway()
 80        {
 81            if (this.SubEvent != null)
 82                this.SubEvent();
 83        }
   
 84    }

 85    public class Cat : Subject
 86    {  
 87        public void Cry()
 88        {
 89            Console.WriteLine("cat cryed.");
 90            this.FireAway();
 91        }

 92    }

 93    public abstract class Observer
 94    {
 95        public Observer(Subject sub)
 96        {
 97            sub.SubEvent += new SubEventHandler(Response);
 98        }

 99        public abstract void Response();    
100    }

101    public class Mouse : Observer
102    {
103        private string name;
104        public Mouse(string name, Subject sub) : base(sub)
105        {   
106            this.name = name;
107        }

108        public override void Response()
109        {
110            Console.WriteLine(name + " attempt to escape!");
111        }

112    }

113    public class Master : Observer
114    {
115        public Master(Subject sub) : base(sub){}
116        public override void Response()
117        {
118            Console.WriteLine("host waken");
119        }

120    }

121    class Class1
122    {
123        static void Main(string[] args)
124        {
125            Cat cat = new Cat();
126            Mouse mouse1 = new Mouse("mouse1", cat);
127            Mouse mouse2 = new Mouse("mouse2", cat);
128            Master master = new Master(cat);
129            cat.Cry();
130        }

131    }

132