JAVA 设计模式 观察者模式
生活随笔
收集整理的這篇文章主要介紹了
JAVA 设计模式 观察者模式
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
用途
觀察者模式 (Observer) 觀察者模式定義了一種一對多的依賴關(guān)系,讓多個觀察者對象同時監(jiān)聽某一個主題對象。
這個主題對象在狀態(tài)發(fā)生變化時,會通知所有觀察者對象,使它們能夠自動更新自己。 觀察者模式是一種行為型模式。
圖-觀察者模式結(jié)構(gòu)圖
????protected?String?name;
????protected?String?state;
????protected?List<Observer>?observers?=?new?ArrayList<Observer>();
????
????public?abstract?String?getState();????
????public?abstract?void?setState(String?state);
????public?abstract?void?Notify();
????public?Subject(String?name)?{
????????this.name?=?name;
????}
????
????public?void?Attach(Observer?observer)?{
????????observers.add(observer);
????}
????
????public?void?Detach(Observer?observer)?{
????????observers.remove(observer);
????}
}
Observer : 觀察者類,定義更新接口 (Update),當收到 Subject 的通知時,Observer 需要同步更新信息。
????protected?String?name;
????protected?Subject?subject;
????public?Observer(String?name,?Subject?subject)?{
????????this.name?=?name;
????????this.subject?=?subject;
????}
????public?abstract?void?Update();
}
ConcreteSubject : 具體主題類,存儲對于這個主題感興趣的所有觀察者。當內(nèi)部狀態(tài)發(fā)生變化時,應(yīng)通知所有登記的觀察者 (Notify)。
????public?ConcreteSubject(String?name)?{
????????super(name);
????}
????@Override
????public?String?getState()?{
????????return?state;
????}
????@Override
????public?void?setState(String?state)?{
????????this.state?=?state;
????}
????
????@Override
????public?void?Notify()?{
????????System.out.println("=======?"?+?this.name?+?"主題發(fā)布新消息?=======");
????????for?(Observer?observer?:?observers)?{
????????????observer.Update();
????????}
????}
}
ConcreteObserver : 具體觀察者類,實現(xiàn) Observer 的更新接口 (Update),以便和 Subject 同步狀態(tài)信息。
????private?String?state;
????public?ConcreteObserver(String?name,?Subject?subject)?{
????????super(name,?subject);
????}
????@Override
????public?void?Update()?{
????????state?=?subject.getState();
????????System.out.println(this.name?+?"收到當前狀態(tài):"?+?state);
????}
}
測試代碼
public?class?ObserverPattern?{????public?static?void?main(String[]?args)?{
????????ConcreteSubject?subject?=?new?ConcreteSubject("天氣");????
????????ConcreteObserver?observer1?=?new?ConcreteObserver("張三",?subject);
????????ConcreteObserver?observer2?=?new?ConcreteObserver("李四",?subject);
????????ConcreteObserver?observer3?=?new?ConcreteObserver("王五",?subject);
????????
????????subject.Attach(observer1);
????????subject.Attach(observer2);
????????subject.Attach(observer3);????
????????subject.setState("今天下雨");
????????subject.Notify();
????????
????????subject.Detach(observer2);
????????subject.setState("明天天晴");
????????subject.Notify();
????}
} View Code
運行結(jié)果
=======?天氣主題發(fā)布新消息?=======張三收到當前狀態(tài):今天下雨
李四收到當前狀態(tài):今天下雨
王五收到當前狀態(tài):今天下雨
=======?天氣主題發(fā)布新消息?=======
張三收到當前狀態(tài):明天天晴
王五收到當前狀態(tài):明天天晴 View Code
?
推薦
本文屬于 JAVA設(shè)計模式系列 。
《大話設(shè)計模式》
《HeadFirst設(shè)計模式》?
總結(jié)
以上是生活随笔為你收集整理的JAVA 设计模式 观察者模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 彼岸 递推动规
- 下一篇: Android中适用于ListView、