1 介紹
Observe模式是行為模式的一種糯崎。主要是用來(lái)監(jiān)聽(tīng)對(duì)象的變化,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí)河泳,會(huì)自動(dòng)的通知其它的關(guān)聯(lián)對(duì)象沃呢。使得該對(duì)象和關(guān)聯(lián)對(duì)象保持一致。
閑扯
不知道各位簡(jiǎn)友有沒(méi)有發(fā)現(xiàn)簡(jiǎn)書(shū)是不是缺少一個(gè)朋友圈的功能乔询,當(dāng)好友發(fā)表一篇簡(jiǎn)書(shū)后樟插,其它好友會(huì)收到通知并可以在朋友圈中進(jìn)行查看、評(píng)論竿刁。但目前來(lái)說(shuō)黄锤,簡(jiǎn)書(shū)雖然說(shuō)是有個(gè)簡(jiǎn)友圈,但是主要是來(lái)告訴好友自己關(guān)注了誰(shuí)食拜,評(píng)論了哪篇文章等鸵熟。并沒(méi)有像朋友圈那樣強(qiáng)大。不過(guò)也許簡(jiǎn)書(shū)設(shè)計(jì)的初衷就是這樣的<a>/(ㄒoㄒ)/~~</a>
但是负甸,作為一個(gè)程序猴來(lái)說(shuō)流强,創(chuàng)造是我們的本能痹届。所以我們要來(lái)實(shí)現(xiàn)這個(gè)功能,使用觀察者模式實(shí)現(xiàn)<a>發(fā)送簡(jiǎn)書(shū)后的通知功能打月。</a>
2 實(shí)現(xiàn)
觀察者模式的幾個(gè)角色
Subject(被觀察者):被觀察的對(duì)象队腐,當(dāng)被觀察對(duì)象的狀態(tài)發(fā)生改變時(shí),會(huì)通知隊(duì)列中所有的觀察者奏篙。(當(dāng)一篇新的簡(jiǎn)書(shū)發(fā)布時(shí)柴淘,通知其它好友)
ConcreteSubject:被觀察者的具體實(shí)現(xiàn),其中包含常見(jiàn)的屬性和操作秘通。(一篇簡(jiǎn)書(shū)自帶的屬性:標(biāo)題为严、內(nèi)容等...)
Observe(觀察者):抽象類或接口,當(dāng)被觀察者的狀態(tài)發(fā)生變化時(shí)肺稀,觀察者對(duì)象會(huì)通過(guò)一個(gè)callback函數(shù)得到通知第股。
ConcreteObserve:觀察者的具體實(shí)現(xiàn),得到通知后完成具體的邏輯實(shí)現(xiàn)话原。(當(dāng)發(fā)了一篇新的簡(jiǎn)書(shū)后以怎樣的形式去通知給簡(jiǎn)友)
具體實(shí)現(xiàn)
被觀察者:User.class
<!--需要繼承Observable--!>
public class User extends Observable{
public void publishArticle(Article article){
System.out.println("我發(fā)表文章:標(biāo)題:"+
article.getTitle() + ",內(nèi)容為:" + article.getContent());
// 設(shè)置被觀察者的狀態(tài)被改變
this.setChanged();
// 通知隊(duì)列中的其它觀察者夕吻,并將改變的內(nèi)容一并發(fā)送過(guò)去
this.notifyObservers(article);
}
}
ConcreteSubject:Article.class
public class Article {
private String title;
private String content;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
ConcreteObserve:MyObserve.class
//需要實(shí)現(xiàn)Observer接口并實(shí)現(xiàn)響應(yīng)的方法
public class MyObserve implements Observer{
// callBack函數(shù),當(dāng)被觀察者狀態(tài)發(fā)生改變時(shí)調(diào)用
@Override
public void update(Observable o, Object arg) {
//接收傳過(guò)來(lái)的對(duì)象
Article article = (Article)arg;
//通知其它簡(jiǎn)友的形式
System.out.println("----------------------------------");
System.out.println("有簡(jiǎn)友發(fā)布新文章:標(biāo)題為:" + article.getTitle());
}
}
測(cè)試: MainClass.class
public class MianClass {
public static void main(String[] args) {
Article article = new Article();
article.setTitle("初來(lái)乍到");
article.setContent("第一篇簡(jiǎn)書(shū)");
User user = new User();
//為用戶注冊(cè)一個(gè)觀察者
user.addObserver(new MyObserve());
//用戶發(fā)表簡(jiǎn)書(shū)繁仁,(即被觀察者狀態(tài)發(fā)生改變)
user.publishArticle(article);
}
}
這樣一來(lái)梭冠,一個(gè)簡(jiǎn)單的通知功能就完成了,當(dāng)然一個(gè)被觀察者可以注冊(cè)多個(gè)觀察者改备,一個(gè)觀察者也是可以被多個(gè)被觀察者所注冊(cè)。
3 應(yīng)用場(chǎng)景
- 當(dāng)一個(gè)抽象模型有兩個(gè)方面, 其中一個(gè)方面依賴于另一方面蔓倍。將這二者封裝在獨(dú)立的對(duì)象中以使它們可以各自獨(dú)立地改變和復(fù)用悬钳。
- 當(dāng)改變一個(gè)對(duì)象的同時(shí)需要改變其它對(duì)象, 而不知道具體有多少對(duì)象有待改變時(shí)。
喜歡的話戳一下喜歡唄偶翅。
有什么建議的話希望大家能在下方回復(fù)(●'?'●)
上一篇:策略模式
下一篇:享元模式