zoukankan      html  css  js  c++  java
  • 关于猫叫、老鼠逃跑、人被惊醒的程序设计

    题目是这样的:猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。

    要求:

    1、要有联动性,老鼠和人的行为是被动的

    2、考虑可扩展行,猫叫声可能会引起其他联动效应

    看到这个程序设计题目,我的第一反应是用事件来解决,猫叫触发了事件,引起了老鼠的逃跑,老鼠逃跑又触发了事件导致主人被惊醒,或者是猫叫引起了老鼠逃跑、人醒。所以按照这个思路,我做出了如下的解答。

        第一种解决方案用事件来解决:是多级的联动:即:猫叫-》老鼠跑-》人醒

        第二种解决方案采用观察者模式:猫叫-》老鼠跑;猫叫-》人醒

    首先,将猫、老鼠、和人分别抽象出来为三个类,分别为:CatMousePeople。在Cat类中我们做如下处理:

     

    public class Cat
    {
        public delegate void Crying(object sender,EventArgs e);//定义一个猫叫委托
        public event Crying cry;//定义猫叫事件
        public void OnCry(EventArgs e)
        {
           if(cry!=null)
           {
               cry(this,e);
           }
        }
       public void StartCrying()//猫叫、触发cry事件
       {
          MessageBox.Show("猫开始叫了......");
          EventArgs e=new EventArgs();
          OnCry(e);
       }
    }
    

     

    public class Mouse
    {
       public delegate void Runing(Object sender,EventArgs e);
       public evnet Running run;
       public void OnRun(EventArgs e)
       {
            if(run!=null)
              {
                 run(this,e); 
              }
       }
       public Mouse(Cat c)
       {
           c.cry+=new Cat.Crying(c_Cry);//注册了猫叫事件,老鼠听到猫叫则开始逃跑
       }
       void c_Cry(object sender,EvnetArgs e)//老鼠在逃跑时又触发了人被惊醒事件
       {
           MessageBox.Show("老鼠开始逃跑了........");
           EventArgs e=new EventArgs();
           OnRun(e);
       }
    }
    public class Person
    {
         public Person(Mouse m)
         {
             m.run+=new Mouse.Runing(m_run);//人注册了老鼠逃跑事件,老鼠逃跑时人被 惊醒
         }
         void m_run(object sender,EventArgs e)
             {
             MessageBox.Show("人醒了,What's wrong?");
             }
    }
    

     

    BtnTest_Click(object sender, EventArgs e)
    {
        Cat c=new Cat();
        Mouse m=new Mouse(c);
        Person p=new Person(m);
        c.StartCrying();
    }

     

    实验效果依次如下:

     

    下面再通过另一个方式来解决这个问题。

    Observer(观察者模式)

    首先我们需要新建两个接口:

     

    public interface Observer
    {
         void Response();//对被观察对象的行为作出反应,这里是指猫叫
    }
    public interface Subject
    {
         void AddObserver(Observer obj);//添加所有的观察者,在发生动作时对他们进行通知
    }
    

     

    public class Cat:Subject
    {
        ArrayList arrlyList;
        public Cat()
        {
           arrlyList=new ArrayList();
        }
        void AddObserver(Observer obj)//实现添加观察着对象的方法
        {
           arrlyList.Add(obj);
        }
        void Cry()//猫叫了,并通知所有的观察者,作出相应的反应
        {
            MessageBox.Show("猫叫了......");
            foreach(Observer obj in arrlyList)
             {
                  obj.Response();
             }
        }
    }
    

     

    public class Mouse:Observer
    {
        public Mouse(Cat c)//将当前的观察着对象添加到观察者集合中
        {
            c.AddObserver(this);
        }
        public void Response()
        {
            MessageBox.show("老鼠开始逃跑了.....");
        }
    }
    

     

    public class People:Observer
    {
       public People(Cat c)//将当前的观察着对象添加到观察者集合中
       {
          c.AddOberver(this);
       }
       public void Respone()
      {
           MessageBox.Show("人醒了,What's Wrong?");
       }
    }
    

     

    Btn_Click(Object sender,EventArgs e)
     {
    Cat c=new Cat();
    Mouse m=new Mouse(c);
    People p=new People(c);
    c.Cry();
     }

    来自:http://www.cnblogs.com/Olive116/archive/2012/11/12/2765934.html
  • 相关阅读:
    逆向入门之路1 关于逆向工程
    EC笔记:第三部分:14、在资源管理类中小心Copying行为
    vuex最简单、最详细的入门文档
    前端加密的几种常见方式
    NAS星云链 入门之从零开发第一个DAPP
    chrome 不支持12px以下字体为题的解决
    input checkbox 多选 验证
    你对javascript的原生操作或者工具了解多少呢?
    ionic2-键盘覆盖输入框和返回键问题解决方案
    ionic2 手风琴效果
  • 原文地址:https://www.cnblogs.com/xiaofengfeng/p/3151751.html
Copyright © 2011-2022 走看看