程序設計: 貓大叫一聲,所有的老鼠都開始逃跑,主人被驚醒。(C#語言)
要求:
1.要有聯動性,老鼠和主人的行為是被動的。
2.考慮可擴展性,貓的叫聲可能引起其他聯動效應。
要點:1. 聯動效果,運行代碼只要執行Cat.Cryed()方法。
2. 對老鼠和主人進行抽象
——————————————————————————————————
看到這個程序設計題目,第一反應是用事件來解決,貓叫觸發了事件,引起了老鼠的逃跑,老鼠逃跑又觸發了事件導致主人被驚醒,或者是貓叫引起了老鼠逃跑、人醒。所以按照這個思路,做出了如下的解答。
第一種解決方案用事件來解決:是多級的聯動:即:貓叫-》老鼠跑-》人醒
第二種解決方案采用觀察者模式:貓叫-》老鼠跑;貓叫-》人醒
首先,將貓、老鼠、和人分別抽象出來為三個類,分別為:Cat、Mouse、People。在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("人醒了"); } } 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(); }
結果跟上邊所示的一樣。
好了,到這里這道程序設計題的解決方案也就是這些了,通過這兩種不同的解決方案我們可以發現,在針對多個不同的觀察者時,使用觀察着實現聯動性,比較方面,而且可擴展性也比較強,事實上觀察者模式也就是主要用於對多個不同的觀察者對象做出不同反應而設計的。在此種模式中,一個目標物件管理所有相依於它的觀察者物件,並且在它本身的狀態改變時主動發出通知。這通常透過呼叫各觀察者所提供的方法來實現。此種模式通常被用來實作事件處理系統。
反觀我們使用第一種方法事件訂閱處理,可以實現多級的聯動,貓叫引發老鼠跑,老鼠跑引發人醒,事件的存在是為了彌補委托的不足,事件是將事件發送者(觸發事件的對象)與事件接受者(處理事件的方法)相關聯的一種代理類,即事件機制是通過代理類來實現的。當一個事件被觸發時,由該事件的代理來通知(調用)處理該事件的相應方法。事件多用於WinForm中的窗體的傳遞值,按鈕的Click事件等。
