#定義
觀察者模式又叫 發(fā)布-訂閱 模式分俯,定義的兩個對象之間是一種一對多的強依賴關系肾筐,當一個對象的狀態(tài)發(fā)生改變,所有依賴它的對象
# 關鍵角色:
1.主題(Subject)
抽象主題以及具體的主題
2.觀察者(Observer)
抽象觀察者以及具體觀察者
##抽象理解:我們訂閱簡書中喜歡的欄目澳迫,一旦這個欄目有通知局齿,我們訂閱用戶會收到通知,我們作為具體觀察者 而訂閱欄目作為具體主題
swing的按鈕監(jiān)聽橄登,通過事件委托機制抓歼,進行分發(fā),來處理不同的事件拢锹,下面舉一個例子
```
package org2.main.swing;
import javax.swing.*;
/**
* Created by Administrator on 2017/4/5
* swing驅動事件
*/
public class MainFrame {
//定義個容器變量
JFrame f = null;
//定義個按鈕變量
JButton btn = null;
public MainFrame() {
//創(chuàng)建容器
f = new JFrame( "事件模型" );
//創(chuàng)建按鈕
btn = new JButton( "按鈕" );
//把按鈕添加到容器中
f.add( btn );
//設置容器大小
f.setSize( 300, 200 );
//把容器設置為 可見
f.setVisible( true );
//給按鈕添加事件處理
//在btn上注冊一個監(jiān)聽器
//(btn其實就是具體的主題對象)
//(而監(jiān)聽器就是具體的觀察者)
//當點擊按鈕時(其實也就是主題對象發(fā)生了改變)谣妻,就會觸發(fā)監(jiān)聽器事件(觀察者更新了)
btn.addActionListener( new MyListener() );
}
//main方法
public static void main( String[] args ) {
new MainFrame();
}
}
```
下面是事件具體處理
```
package org2.main.swing;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
* Created by Administrator on 2017/4/5
* 定義一個監(jiān)聽器(具體觀察者)
*/
public class MyListener implements ActionListener {
//該方法類似于觀察中的update方法
@Override
public void actionPerformed( ActionEvent e ) {
System.out.println( "按鈕被點擊,執(zhí)行一些業(yè)務邏輯操作" );
}
}
```
#總結
總的來說卒稳,觀察者模式所做的工作其實就是在解除耦合蹋半。讓耦合雙方都依賴抽象,
而不是具體充坑。從而使得各自的變化都不影響其他一方减江。這也符合了依賴倒置原則。
#使用原則
1.當一個對象的改變需要同時改變其他對象時捻爷。
2.一個對象不知道它的改變會影響多少個類的改變辈灼。
3.當有一個抽象模型有兩個方面,一面依賴另一面也榄。這時觀察者模式可以很好地
將兩者封裝在獨立的對象使它們各自獨立改變和復用巡莹。
最后:重寫組件時可能運用到觀察者模式,在數(shù)據(jù)處理,數(shù)據(jù)更新降宅,通知其他消息組件時骂远,都可以運用到!
#缺點
觀察者設計模式中需要每個觀察者重寫通知方法腰根,但是實際運用中激才,不可能能每個觀察者都有通知方法,那么怎么解決這個問題呢唠雕,那就是運用消息隊列來處理贸营,擁有消息通知方法的觀察者發(fā)布消息到隊列中,實際主題只需要設計響應的方法從消息隊列中取出消息數(shù)據(jù)即可岩睁!提供實際類
參考
java.util.concurrent.BlockingQueue;
java.util.concurrent.LinkedBlockingQueue;