程序设计: 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。(C#语言) 要求:  1.要有联动性,老鼠和主人的行为是被动的。2.考虑可扩展性,猫的叫声可能引起其他联动效应。要点:1. 联动效果,运行代码只要执行Cat.Cryed()方法。2. 对老鼠和主人进行抽象 
评分标准:
            <1>.构造出Cat、Mouse、Master三个类,并能使程序运行(2分)   
            <2>从Mouse和Master中提取抽象(5分) 
            <3>联动效应,只要执行Cat.Cryed()就可以使老鼠逃跑,主人惊醒。(3分) 
复制内容到剪贴板 
代码:
public interface Observer
    {
        void Response();    //观察者的响应,如是老鼠见到猫的反映
    }
    public interface Subject
    {
        void AimAt(Observer obs);  //针对哪些观察者,这里指猫的要扑捉的对象---老鼠
    }
    public class Mouse : Observer
    {
        private string name;
        public Mouse(string name, Subject subj)
        {         
            this.name = name;
            subj.AimAt(this);
        }
       
        public void Response()
        {
            Console.WriteLine(name + " attempt to escape!");
        }
    }
    public class Master : Observer
    { 
        public Master(Subject subj)
        {         
            subj.AimAt(this);
        }
       
        public void Response()
        {
            Console.WriteLine("Host waken!");
        } 
    }    public class Cat : Subject
    {
        private ArrayList observers;
        public Cat()
        { 
            this.observers = new ArrayList();
        }
        public void AimAt(Observer obs)
        {
            this.observers.Add(obs);
        }
        public void Cry()
        {
            Console.WriteLine("Cat cryed!");
            foreach (Observer obs in this.observers)
            {
                obs.Response();
            }
        }
    }
    class MainClass
    {     
        static void Main(string[] args)
        {
            Cat cat = new Cat();
            Mouse mouse1 = new Mouse("mouse1", cat);
            Mouse mouse2 = new Mouse("mouse2", cat);
            Master master = new Master(cat);
            cat.Cry();
        }
    } 
设计方法二: 使用event -- delegate设计.. 
复制内容到剪贴板 
代码:
public delegate void SubEventHandler();
    public abstract class Subject
    {
        public event SubEventHandler SubEvent;
        protected void FireAway()
        {
            if (this.SubEvent != null)
                this.SubEvent();
        } 
    }
    public class Cat : Subject
    { 
        public void Cry()
        {
            Console.WriteLine("cat cryed.");
            this.FireAway();
        }
    }
    public abstract class Observer
    {
        public Observer(Subject sub)
        {
            sub.SubEvent += new SubEventHandler(Response);
        }
        public abstract void Response();   
    }
    public class Mouse : Observer
    {
        private string name;
        public Mouse(string name, Subject sub) : base(sub)
        { 
            this.name = name;
        }
        public override void Response()
        {
            Console.WriteLine(name + " attempt to escape!");
        }
    }
    public class Master : Observer
    {
        public Master(Subject sub) : base(sub){}
        public override void Response()
        {
            Console.WriteLine("host waken");
        }
    }
    class Class1
    {
        static void Main(string[] args)
        {
            Cat cat = new Cat();
            Mouse mouse1 = new Mouse("mouse1", cat);
            Mouse mouse2 = new Mouse("mouse2", cat);
            Master master = new Master(cat);
            cat.Cry();
        }
    }
http://www.cnblogs.com/hiearth/archive/2009/06/24/1510581.html
唐山迪锐软:www.tsp2c.cn

解决方案 »

  1.   

    我扩展了一下
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Collections;namespace ConsoleApplication7
    {
        class Program
        {
            public interface Mind
            {
                void Think();
                void Think(String ListenSomeThing);
            }        public interface Observer:Mind 
            {
                void Response();    //观察者的响应,如是老鼠见到猫的反映
            }
            public interface Subject : Mind
            {
                void AimAt(Observer obs);  //针对哪些观察者,这里指猫的要扑捉的对象---老鼠 
            }
            public class Mouse : Observer
            {
                private string name;
                Subject subj;
                public Mouse(string name, Subject subj)
                {
                    this.name = name;
                    this.subj = subj;
                    subj.AimAt(this);
                }            public void Response()
                {
                    Think();
                }            public void Think()
                {
                    Console.WriteLine(name + "想和猫打架");
                    subj.Think(name + "想和猫打架");
                }
                public void Think(String ListenSomeThing)
                {
                    if (ListenSomeThing ==name + "小样")
                        Console.WriteLine(name + " attempt to escape!");
                }
            }        public class Master : Observer
            {
                public Master(Subject subj)
                {
                    subj.AimAt(this);
                }            public void Response()
                {
                    Console.WriteLine("Host waken!");
                }            public void Think()
                {
                    Console.WriteLine("我要睡觉");
                }            public void Think(string ListenSomeThing)
                {
                    Console.WriteLine("吵死了");
                }
            }        public class Cat : Subject
            {
                private ArrayList observers;
                public Cat()
                {
                    this.observers = new ArrayList();
                }
                public void AimAt(Observer obs)
                {
                    this.observers.Add(obs);
                }
                public void Cry()
                {
                    Console.WriteLine("Cat cryed!");
                    foreach (Observer obs in this.observers)
                    {
                        obs.Response();
                    }
                }            public void Think()
                {
                    Console.WriteLine("我要吃老鼠");
                }            public void Think(string ListenSomeThing)
                {
                    String Mouse = ListenSomeThing.Substring(0, 6);
                    String Say = ListenSomeThing.Remove(0, 6);
                    if (Say == "想和猫打架")
                        foreach (Observer obs in this.observers)
                        {
                            obs.Think(Mouse+"小样"); 
                        }
                }
            }        class MainClass
            {
                static void Main(string[] args)
                {
                    Cat cat = new Cat();
                    Mouse mouse1 = new Mouse("mouse1", cat);
                    Mouse mouse2 = new Mouse("mouse2", cat);
                    Master master = new Master(cat);
                    cat.Cry();
                    Console.Read();
                }
            }
        }
    }
      

  2.   

    要记住,《设计模式》那本书写的时候,作者跟本不懂event或者delegate,所以你在设计模式中看不到也学不到event和delegate技术。所以,不要以为设计模式就是葵花宝典,因为它(相对于.net开发人员需要理解的技术)根本就是缺少JJ的。
      

  3.   

    另外,在.net中,接口中不仅仅可以定义field、property、method,也同样可以定义event和delegate。所以,不要把“面向接口编程”跟“使用event和delegate”对立起来,无法这样分开编程类型。
      

  4.   

    因为它根本就是缺少JJ的  -->  因为它的作者根本就是缺少JJ的呵呵,为了这个暗喻为读者负责,我还真的搜索了一下我印象中的《葵花宝典》的典故,它还真个特别印证我对《设计模式》这本邪书的看法。http://baike.baidu.com/view/3054.htm
      

  5.   

    顶,,,学习!!!本人 有疑问  多态,接口http://topic.csdn.net/u/20091017/21/95c1915d-2903-4eb0-903a-9b705efbf246.html请赐教 LZ 和 楼上的 大哥