日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

JAVA 设计模式 观察者模式

發(fā)布時(shí)間:2024/4/14 asp.net 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JAVA 设计模式 观察者模式 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

用途


觀察者模式 (Observer) 觀察者模式定義了一種一對(duì)多依賴關(guān)系,讓多個(gè)觀察者對(duì)象同時(shí)監(jiān)聽某一個(gè)主題對(duì)象。
這個(gè)主題對(duì)象在狀態(tài)發(fā)生變化時(shí),會(huì)通知所有觀察者對(duì)象,使它們能夠自動(dòng)更新自己。 觀察者模式是一種行為型模式



結(jié)構(gòu)

圖-觀察者模式結(jié)構(gòu)圖

Subject : 主題類,保存所有訂閱此主題的觀察者,觀察者的數(shù)量是任意的。定義添加觀察者 (Attach) 刪除觀察者 (Detach) 的接口。 abstract?class?Subject?{
????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),當(dāng)收到 Subject 的通知時(shí),Observer 需要同步更新信息。

abstract?class?Observer?{
????protected?String?name;
????protected?Subject?subject;
????public?Observer(String?name,?Subject?subject)?{
????????this.name?=?name;
????????this.subject?=?subject;
????}
????public?abstract?void?Update();
}

ConcreteSubject : 具體主題類,存儲(chǔ)對(duì)于這個(gè)主題感興趣的所有觀察者。當(dāng)內(nèi)部狀態(tài)發(fā)生變化時(shí),應(yīng)通知所有登記的觀察者 (Notify)

class?ConcreteSubject?extends?Subject?{
????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 : 具體觀察者類,實(shí)現(xiàn) Observer 的更新接口 (Update),以便和 Subject 同步狀態(tài)信息。

class?ConcreteObserver?extends?Observer?{
????private?String?state;
????public?ConcreteObserver(String?name,?Subject?subject)?{
????????super(name,?subject);
????}

????@Override
????public?void?Update()?{
????????state?=?subject.getState();
????????System.out.println(this.name?+?"收到當(dāng)前狀態(tài):"?+?state);
????}
}

測(cè)試代碼

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

運(yùn)行結(jié)果

=======?天氣主題發(fā)布新消息?=======
張三收到當(dāng)前狀態(tài):今天下雨
李四收到當(dāng)前狀態(tài):今天下雨
王五收到當(dāng)前狀態(tài):今天下雨
=======?天氣主題發(fā)布新消息?=======
張三收到當(dāng)前狀態(tài):明天天晴
王五收到當(dāng)前狀態(tài):明天天晴 View Code


?

推薦

本文屬于 JAVA設(shè)計(jì)模式系列



參考資料

《大話設(shè)計(jì)模式》

《HeadFirst設(shè)計(jì)模式》

?

總結(jié)

以上是生活随笔為你收集整理的JAVA 设计模式 观察者模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。