高中和初中的時候我們班里面每次都會有一兩個同學挨著窗口坐著,當班主任來的時候,他們就會咳嗽兩聲,所有人就會立馬安靜,做一個愛學習的乖孩子,哈哈,其實觀察者模式就這種情況,一樣一樣的。
(如有異同請指出)
定義:一種一對多額依賴關系,讓多個觀察者對象同事監聽某一個主題的對象,這個主題對象在狀態發生變化時,會通知所有觀察者對象,使他們能夠自動更新自己。 解釋:其實上面這一段話已經說的很明白了,觀察者模式又被叫做發布-訂閱模式,他利用的原則是依賴倒轉原則,通過抽象接口來實現解耦合,如果耦合性強的話就會,牽一發而動全身,所以我們通過抽象接口來改變,當觀察者發生變化的時候,不會影響通知者,但弊端就是觀察者離不開通知者。
1.抽象主題(例如boss類)(Subject):把觀察對象放到一個瓶子里面,每個主題都有不定量的觀察者,抽象主題提供接口,可以刪除或者是增加觀察者對象 2..具體主題(ConcreteSubject):將有關狀態存入具體觀察者對象中,在內部狀態改變時,會發給觀察者發出通知 3.. 抽象觀察者(Observer):為所有具體觀察者提供接口,可以更新自己 4.. 具體觀察者(ConcreteObserver):實現抽象觀察者所要實現的更新接口,使狀態協調。
代理類ConcreteOberve
//觀察者的名字與具體的狀態 public ConcreteOberver(ConcreteSubject subject, string name) { this.subject = subject; this.name = name; } //實現接口的更新方法 public override void Update() { observerState = subject.SubjectState; Console.WriteLine("觀察者{0}的新狀態{1}",name ,observerState );Subject
//subject可以使主題,或者是抽象通知者,一般用一個抽象類或者一個接口實現,他把所有觀察者的對象引用在聚集里,抽象主題提供一個接口,可以增加和刪除觀察者對象 abstract class Subject { //有多少觀察者 PRivate IList<observer> observers = new List<observer>(); //增加和刪除觀察者 public void Attach(observer observer) { observers.Add(observer ); } public void Detach(observer observer) { observers.Remove(observer); } //遍歷通知 public void Notify() { foreach (observer o in observers ) { o.Update(); } } }observer
//抽象觀察者,為所有具體觀察者定義一個接口,得到主題的通知時更新自己,更新方法,通知者通過這個接口來實現方法 abstract class observer { public abstract void Update(); }ConcreteSubject
//具體通知者,將有關狀態存入具體觀察者對象,當狀態改變時給所有觀察者發通知 class ConcreteSubject:Subject { private string subjectState; public string SubjectState { get { return subjectState; } set { subjectState = value; } } }新聞熱點
疑難解答