当前位置:编程学习 > C#/ASP.NET >>

一个面试题,请教高手:一个警报系统响了,小偷被吓跑了,车主被吓醒了,请写个程序出来(警报系统要有拓展性)

一个面试题,请教高手:一个警报系统响了,小偷被吓跑了,车主被吓醒了,请写个程序出来(警报系统要有拓展性) --------------------编程问答-------------------- 有意思,呆会儿看看 --------------------编程问答-------------------- 请LZ参考设计模式-Observer模式 --------------------编程问答-------------------- 这个题我面试匠时候考过,我没答上来,一起去的几个人答的也不怎么好 --------------------编程问答-------------------- 程序设计: 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。(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();
        }

    }
--------------------编程问答-------------------- 好熟悉...
北大青鸟上C#的时候说委托那章讲过这问题 --------------------编程问答-------------------- 就是那个猫和老鼠! --------------------编程问答-------------------- 通知者模式  
猫和老鼠还有人得 --------------------编程问答-------------------- up --------------------编程问答-------------------- Mark --------------------编程问答-------------------- ding --------------------编程问答-------------------- 我觉得就是事件
事件被触发了就是警报响了,
警报响了就可以处理小偷被吓跑了,车主被吓醒 --------------------编程问答-------------------- he_8134(求职-广州-C#-1.5k以上)

Good --------------------编程问答-------------------- 转贴的~~~~ --------------------编程问答-------------------- 做标记!
慢慢看 --------------------编程问答-------------------- Mark --------------------编程问答-------------------- mark --------------------编程问答-------------------- mark --------------------编程问答-------------------- mark
--------------------编程问答-------------------- 听说有分,进来看一下,不过不错。。学习一下了 --------------------编程问答-------------------- 其实就是体现多态性 --------------------编程问答-------------------- 有意思 --------------------编程问答-------------------- 标记 学习 --------------------编程问答-------------------- 我提一个问题:

一个警报系统响了

小偷被吓跑了
车主被吓醒了
你的代码 能够 做到 "小偷被吓跑了" "车主被吓醒了"这两个触发 在时间上 的前后顺序
不一定吗。

考虑过 事件模拟的 无序模拟吗(在一些模拟或游戏系统 需要) --------------------编程问答-------------------- 标记 --------------------编程问答-------------------- 主要是学习 --------------------编程问答-------------------- 委托 --------------------编程问答-------------------- 做个标记,慢慢看. --------------------编程问答-------------------- mark --------------------编程问答-------------------- mark --------------------编程问答-------------------- 有意思 --------------------编程问答-------------------- mark --------------------编程问答-------------------- 就是一个委托 --------------------编程问答-------------------- 不熟,看来得多多努力了。
  
------------------------
http://www.72598.com 
------------------------ --------------------编程问答-------------------- 一个警报系统响了

小偷被吓跑了
车主被吓醒了

创建警报系统的时候,把车主当构造函数的参数 --------------------编程问答-------------------- 小偷被吓跑了
和小偷们被吓跑了是不一样的. --------------------编程问答-------------------- <?
class xiaotou{
//构造
private $starut=""; //动作
private $ok="";   //被抓住与否
public function __construct(){
$this->starut="NULL";
}
//开始偷东西
public function starttou(){
$this->starut="TOU";
echo "小偷:小偷我 开始偷东西咯...哈哈....<br>";
}
//跑
public function run(){
$this->starut="RUN";
echo "小偷:快跑呀...该死的..破报警器...<br>";
}
//被抓住
public function gameover(){
$this->ok="zhuazhu";
echo "小偷:我操.你个Y的...怎么跑这么快<br>";
}
//被跑掉
public function isok(){
$this->ok="nozhuazhu";
echo "小偷:哈哈 想抓我....还嫩点儿...我就是江湖人称:BOB盗圣<br>";
$this->touchechenggong();
}
//偷车成功
public function touchechenggong(){
echo "小偷:把法拉利 开回家咯....嘟嘟.......<br>";
}
//返回小偷状态
public function getstarut(){
return $this->starut;
}
}
?>

<?
include_once ("xiaotou.class.php");
 class chezhu{
  //构造
private $starut=""; //状态
private $xiaotou;  //小偷类
public function __construct(){
$this->starut="NULL";
$this->xiaotou=new xiaotou();
}
//睡觉
public function slep(){
$this->starut="SLEEP";
echo "车主: zZzZzZzZzZ<br>";
}
//唤醒
public function warkup(){
$this->starut="WARKUP";
echo "车主:我操....谁感偷我车.........<br>";
}
//追逐
public function zhui(){
if(rand(0,1)%2==0){
$this->xiaotou->gameover(); //抓住
echo "车主:小子耶......还跑到警察局去<br>";
}else{
$this->xiaotou->isok(); //被跑掉
echo "车主:你吃的甚么东西呀...跑的这么快<br>";
}
}
//返回车主状态
public function getstarut(){
return $this->starut;
}
 }
?>


<?
include_once ("xiaotou.class.php");
/**
**警报器类
*/
class jingbaoqi{
//构造
private $xianglingqi=""; //响铃器
private $xiaotou;  //小偷类
public function __construct(){
$this->xianglingqi="false";
$this->xiaotou=new xiaotou();
}
//警报响起
public function open(){
if(rand(0,2)%2==0){
$this->xianglingqi="true";
echo "警报器: 嘟嘟嘟嘟嘟嘟嘟嘟...........<br>";
}else{
echo "警报器: 功能失灵,被小偷绕过防火墙<br>";
$this->xiaotou->touchechenggong(); //偷车成功
}

}
//警报关闭
public function close(){
$this->xianglingqi="false";
echo "警报器关闭<br>";
}
//返回响铃器
public function getxianglingqi(){
return $this->xianglingqi;
}

}
?>


<?
include_once ("xiaotou.class.php");
include_once("chezhu.class.php");
include_once("jingbaoqi.class.php");
$xiaotou=new xiaotou();
$chezhu=new chezhu();
$chezhu->slep();  //使车主睡觉
$jingbaoqi=new jingbaoqi();

if($_POST["tou"]!=""){
$xiaotou->starttou();  //开始偷
if($xiaotou->getstarut()=="TOU"){
$jingbaoqi->open(); //打开警报器
}
if($jingbaoqi->getxianglingqi()=="true"){
$chezhu->warkup(); //车主被吓醒
$xiaotou->run();  //小偷开始跑
$chezhu->zhui();  //车主开始追逐          
$jingbaoqi->close(); //关闭警报器
}else{

}

}
?>

<form action="view.php" method="post">
<input name="tou" type="submit" value="主演:小偷^@^....开始偷东西^_^" />
</form>
<?
?> --------------------编程问答-------------------- 顶住,PHP强势出击,高手, --------------------编程问答-------------------- 观察者模式 --------------------编程问答-------------------- 高,实在是高! --------------------编程问答-------------------- up --------------------编程问答-------------------- 标记下 一会来看 --------------------编程问答-------------------- 哇```LS好搞笑`` --------------------编程问答-------------------- mArk,学习中... --------------------编程问答-------------------- 发射点 --------------------编程问答-------------------- 靠, 太厉害了把 --------------------编程问答-------------------- 典型的Observer模式应用
面试的公司也没有什么新意啊? --------------------编程问答-------------------- Mark --------------------编程问答-------------------- up --------------------编程问答-------------------- 有意思     受益匪浅
  


   学习 --------------------编程问答-------------------- TO withcsharp:

如果想要无序响应,则通过Observer实现时,可对ArrayList以随机值排序,这时遍历响应时,每次顺序都不一样了,可能是Mouse先跑,也可能是Master先醒 --------------------编程问答-------------------- --------------------编程问答-------------------- mark --------------------编程问答-------------------- mark --------------------编程问答-------------------- 有意思 --------------------编程问答-------------------- end_wolf() 
的程序有新意,好玩,哈哈
--------------------编程问答-------------------- 学习学习~ 嘎嘎 --------------------编程问答-------------------- 真是高手啊.

顶一下. 学习学习. --------------------编程问答-------------------- mark --------------------编程问答-------------------- 学习,有意识啊! --------------------编程问答-------------------- mark --------------------编程问答-------------------- mark --------------------编程问答-------------------- bj --------------------编程问答-------------------- mark --------------------编程问答-------------------- hao --------------------编程问答-------------------- mark --------------------编程问答-------------------- 1、车
2、警报器
3、小偷
4、用户
5、响声

车和警报器的关系:车有很多的类型,但是支持某种接口的车可以安装警报器,安装的警报器也有一个标准接口

小偷和警报器的关系,小偷可以觉察到警报器的警报,小偷对安装了警报器的车采取行动时必然会被觉察,警报器可以感知小偷,所以,小偷必定有一个特殊的接口,但是这个接口并非警报器访问的,而是车访问的,小偷要偷车必须要让车访问他的这个接口,车访问后一定会通知警报器。

警报器和声音的关系,警报器应当提供多种警报方式,声音仅仅是其中的一个,声音本身封装数据,包括来源、频率之类的,声音应当是警告方式抽象类的子类,同时,警报器需要环境来播发警报,环境对象提供对外一致接口,任何挂接环境接口的对象都可以收到警报。

用户通过挂接环境对象获得警报。

小偷是必须获得警报的,他获得警报的方式,是他提供给车的接口。

可扩展的部分,警告方式,偷盗方式、警告接受者。

偷盗方式中,不同的小偷具有不同的接口,行为会有差异。但是,这仅对车发生作用,警报器不能直接感知这些差异。 --------------------编程问答-------------------- mark --------------------编程问答-------------------- 该回复被版主删除 --------------------编程问答-------------------- mark --------------------编程问答-------------------- 其实我觉得这个根本不是标准的 observer 模式

不知道为什么每次都用这样的例子 --------------------编程问答-------------------- |mark|
--------------------编程问答-------------------- mark

回头再看!!! --------------------编程问答-------------------- using System;
using System.Collections.Generic;
using System.Text;

namespace delegrate
{
    public  delegate void Handler();
    public abstract class Subject
    {
        public event Handler ha;
        protected void fireAway()
        {
            if(ha!=null)
            {
                this.ha();
            } 
        }
    }

    public class Cat:Subject 
    {
        string name = "";
        public Cat(string name)
        {
            this.name = name;
        }
        public void cry()
        {
            Console.WriteLine(this.name+" cry");
            this.fireAway();
            
        }
    }

    public abstract class Observer
    {
        public Observer(Subject su)
        {
            su.ha+=new Handler(this.Response);
 
        }
        public abstract void Response();

    }

    public class Mouse:Observer
    {
        string name;
        public Mouse(string name,Subject su) : base(su) 
        {
            this.name = name;
        }
        public override void Response()
        {
            Console.WriteLine(this.name + " run");
        }
    }

    public class Master : Observer
    {
        string name;
        public Master(string name, Subject su)
            : base(su)
        {
            this.name = name;
        }
        public override void Response()
        {
            Console.WriteLine(this.name + " wakeup");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Cat cat1 = new Cat("cat1");
            Cat cat2 = new Cat("cat2");
            Mouse mouse1 = new Mouse("mouse1", cat1);
            Mouse mouse2 = new Mouse("mouse2", cat2);
            Master master1 = new Master("master1", cat1);
            Master master2 = new Master("master2", cat2);
            cat2.cry();
            cat1.cry();
            Console.Read();
        }
    }
}
--------------------编程问答-------------------- 运行结果:
cat2 cry
mouse2 run
master2 wakeup
cat1 cry
mouse1 run
master1 wakeup
--------------------编程问答-------------------- mark 观察者 --------------------编程问答-------------------- 厉害的人们…… --------------------编程问答-------------------- 厉害……学习啊! --------------------编程问答-------------------- 学学..... --------------------编程问答-------------------- mark --------------------编程问答-------------------- using System;
using System.Collections.Generic;
using System.Text;

namespace delegrate
{
    public delegate void Handler();
    public delegate void CarToManHandler();


    public abstract class Subject
    {
        public event Handler ha;


        protected void fireAway()
        {
            if (ha != null)
            {
                this.ha();
            }
        }

    }

    public class Thief : Subject
    {
        string name = "";
        int speed=0;
        public Thief(string name,int speed)
        {
            this.speed=speed;
            this.name = name;
        }
        public void thieve()
        {
            Console.WriteLine("我是小偷" + this.name + ":天黑黑,偶出场!这辆别摸我(BMW)不错嘛,我摸...");
            this.fireAway();
        }
    }

    public abstract class Observer
    {
        public event CarToManHandler cartoman;
        public Observer(Subject su)
        {
            su.ha += new Handler(this.Response);

        }
        public abstract void Response();

        protected void alert()
        {
            if (cartoman != null)
            {
                this.cartoman();
            }
        }
    }

    public class Car : Observer
    {
        string name;
        bool haveSiren;

        public Car(string name, Subject su,bool haveSiren)
            : base(su)
        {
            this.name = name;
            this.haveSiren = haveSiren;
        }

        public override void Response()
        {
            if (haveSiren)
            {
                Console.WriteLine(this.name + ":敢摸我,我喊!嘀,嘀,嘀!");
                this.alert();
              
            }
            else
            {
                Console.WriteLine(this.name + "敢摸我,我喊!咦,咋没声音呢?主人你好小气啊,不给我装报警器,我被偷了!");

            }
        }
    }

    public abstract class Observer2
    {
 
        public Observer2(Observer su)
        {
           su.cartoman+=new CarToManHandler(Response);
        }
        public abstract void Response();

    }


    public class Master : Observer2
    {
        string name;
        int speed = 0;
        public Master(string name, Observer su,int speed)
            : base(su)
        {
            this.name = name;
        }
        public override void Response()
        {
            Console.WriteLine(this.name + ":我怎么梦见报警器在响?(掐一掐大腿,痛!)天哪不是做梦,该死的小偷,给我站住,追。。。。。。。");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Thief thief1 = new Thief("XXX1", 100);
            Car car1 = new Car("car1", thief1, false);
            Master master1 = new Master("master1", car1, 200);
            thief1.thieve();


            Console.WriteLine("");

            Thief thief2 = new Thief("XXX2", 100);
            Car car2= new Car("car2", thief2, true);
            Master master2 = new Master("master2", car2, 200);
            thief2.thieve();




            Console.Read();
        }
    }
}
--------------------编程问答-------------------- 运行结果:
我是小偷XXX1:天黑黑,偶出场!这辆别摸我(BMW)不错嘛,我摸...
car1敢摸我,我喊!咦,咋没声音呢?主人你好小气啊,不给我装报警器,我被偷了!

我是小偷XXX2:天黑黑,偶出场!这辆别摸我(BMW)不错嘛,我摸...
car2:敢摸我,我喊!嘀,嘀,嘀!
master2:我怎么梦见报警器在响?(掐一掐大腿,痛!)天哪不是做梦,该死的小偷,给我
站住,追。。。。。。。
--------------------编程问答-------------------- mark学习 --------------------编程问答-------------------- public event Handler ha;
public event CarToManHandler cartoman

在事件上还是有点不清楚~~ --------------------编程问答-------------------- 多线程,用event触发 --------------------编程问答-------------------- 哇,严重且认真的mark
--------------------编程问答-------------------- mark --------------------编程问答-------------------- 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.AimAt(mouse1);
            cat.AimAt(mouse2);
            cat.AimAt(master);
            cat.Cry();
        }
    } --------------------编程问答-------------------- mark --------------------编程问答-------------------- public interface I反应{
   void 反应();//老鼠、主人
}
public interface I针对谁{
   void 针对();//老鼠、主人.猫
}
public class 老鼠 : I反应 
{
   string 老鼠名;
   
   
   老鼠(string 老鼠名字,I针对谁){
     老鼠名 = 老鼠名字;
     I针对谁.针对 = this;
   }
   void 反应(){
     Console.WriteLine("跑了");
   }
}
public class 主人 : I反应 
{
   string 主人名;
   
   
   主人(string 主人名字,I针对谁){
     主人名 = 主人名字;
     I针对谁.针对 = this;
   }
   void 反应(){
     Console.WriteLine("醒了");
   }
}
public class 猫 : I针对谁 
{
   ArrayList 针对对象列表;
   
   void 针对(I针对谁 o){
      针对对象列表.add(o);
   }
   
   主人(string 主人名字,I针对谁){
     主人名 = 主人名字;
     I针对谁.针对 = this;
   }
   void 反应(){
     Console.WriteLine("醒了");
   }
}
public static void main(){
     猫 cat = new 猫();
     老鼠 mouse1 = new 老鼠("A",cat);
     老鼠 mouse2 = new 老鼠("B",cat);
     主人 mater = new 主人(“master”,cat);
     cat.针对(mouse1);
     cat.针对(mouse2);
     cat.针对(master);
     cat.cry();
} --------------------编程问答-------------------- 猫和老鼠的面食题 --------------------编程问答-------------------- up --------------------编程问答-------------------- 学习了~! --------------------编程问答-------------------- 学习 --------------------编程问答-------------------- mark! mark! --------------------编程问答-------------------- markmark --------------------编程问答-------------------- 用虚函数可以实现吧,研究中 --------------------编程问答-------------------- Mark 不错的练习题 --------------------编程问答-------------------- 北大青鸟喜欢搞这些东西?
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,