目地:通过调用猫叫的方法,联动鼠逃和人醒
设计:
设计一个委托,同时在猫类中声明一个该类型的事件,在猫叫这个方法里面触发这个事件。
声明一个观察者基类,同时声明一个猫对象,在构造函数中给猫对象的猫叫事件增加一个处理方法Act。但是Act方法是一个抽象方法,具体处理由扩展类自己去处理,这样就为猫叫事件的处理增加了扩展性,使得不同的观察者可以对同一个事件产生不同的处理方法。
声明一个老鼠类,继承自观察者基类,在构造时,调用基类构造方法,同时给自己赋值。覆盖基类的Act方法,从而使得老鼠对于猫叫事件有了自己的处理。
声明一个人类,同样继承自观察者基类,在构造时,也调用基类构造方法,同时给自己赋值。覆盖基类的Act方法,从而使得人对于猫叫事件有了自己的处理。
最后是主程序。
运行结果:
设计:
- public delegate void doSomethings();
- class Cat
- {
- public string name;
- public event doSomethings afterCry;
- public Cat(string _name)
- {
- name = _name;
- }
- public void Cry()
- {
- Console.WriteLine("猫 "+name+" 叫;");
- afterCry();//触发猫叫以后的事件;
- }
- }
- abstract class ObserverBase
- {
- protected Cat cat;
- protected ObserverBase(Cat c)
- {
- cat = c;
- if(c!=null)
- c.afterCry += new doSomethings(Act);
- }
- protected abstract void Act();
- }
- class Mouse:ObserverBase
- {
- private string name;
- public Mouse(string name, Cat enemy):base(enemy)
- {
- this.name = name;
- }
- protected override void Act()
- {
- if(cat!=null)
- Console.WriteLine("猫 " + base.cat.name + " 叫,老鼠 " + name + "逃");
- }
- }
- class Person : ObserverBase
- {
- string name;
- public Person(string name,Cat pet):base(pet)
- {
- this.name = name;
- }
- protected override void Act()
- {
- if(base.cat!=null)
- Console.WriteLine("猫 "+base.cat.name+" 叫,人 "+name+" 醒;");
- }
- }
- class Program
- {
- static void Main(string[] args)
- {
- Cat cobj = new Cat("Tom");//有只猫叫Tom
- Mouse mobj = new Mouse("Jerry", cobj);//有只老鼠叫Jerry,它的敌人是猫Tom
- Person pobj = new Person("Mike", cobj);//有个人叫Mike,他养了一只叫Tom的宠物猫
- cobj.Cry();//Tom猫叫了一声
- Console.ReadLine();
- }
- }
运行结果:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/yuchang1980/EntryImages/20081104/%E6%9C%AA%E5%91%BD%E5%90%8D.jpg)