眼看着looking for job的日子越來越近,感覺把以前的東西都忘記了,現在僅僅是記得一些基本概念,所以現在必須要拾起來。
昨天看到了一道面試題,描述如下:貓大叫一聲,所有的老鼠都開始逃跑,主人被驚醒。於是想了想,開啟了下面的觀察者模式:
一、 “貓叫系統”
銀行的防盜系統、高溫預警系統、事件處理系統、監控系統,以及這里的“貓叫系統”,其共同特點在於:一個對象的改變會同時影響其他對象做出相應的變化,但是又不知道到底會影響多少個對象。
二、 觀察者模式
觀察者模式定義了對象之間一對多的依賴關系,當一個對象的狀態發生變化時,所有依賴於該對象的其他對象都會被通知,然后自動更新。
觀察者模式中,被觀察者管理其它的、依賴於它的觀察者對象,當被觀察者的狀態發生變化時,被觀察者會主動發出通知,通知依賴於它的觀察者,當觀察者收到通知時,會做出相應的動作。
三、 “貓叫系統”分析
下面是該例的具體分析過程:
1、系統中共有3個對象:Cat、Mouse、Human
2、首先,明確一下,哪些對象是觀察者,也就是哪些對象需要被通知,哪些對象是被觀察者。這里,貓是被觀察者,正是由於貓的大叫,才引起后面的一系列反應。
3、當貓大叫的時候,就相當於發出了“警告”,此時,老鼠聽到了,然后做出了反應,那就是逃跑。同時,睡夢中的Human也被“警告”嚇醒了。
四、 觀察者模型
五、 模式實現
//Subject接口 public abstract class Subject { private ArrayList observerList = new ArrayList(); public void Attach(Observer observer) { observerList.Add(observer); } public void Detach(Observer observer) { observerList.Remove(observer); } public void Notify() { foreach (Observer item in observerList) { item.Update(); } } } public class Cat : Subject { private string catstate; public string CatState { get { return catstate; } set { catstate = value; } } } //Observer接口 public interface Observer { void Update(); } //具體的Observer public class Mouse : Observer { private Cat cat; public Mouse(Cat cat) { this.cat = cat; } public void Update() { if (this.cat.CatState == "cry") { Console.WriteLine("The cat cry, and the Mouse run!" ); } } } public class Human : Observer { private Cat cat; public Human(Cat cat) { this.cat = cat; } public void Update() { if (this.cat.CatState == "cry") { Console.WriteLine("The cat cry, and the Human wake!"); } } } //系統開始運行 class Program { static void Main(string[] args) { Cat cat = new Cat(); cat.Attach(new Mouse(cat)); cat.Attach(new Human(cat)); cat.CatState = "cry"; cat.Notify(); } }