java監聽設計模式(java觀察者設計模式)
今天給大家分享一下觀察者設計模式(監聽設計模式),該模式在很多主流得框架、原始碼中使用率非常高。在分享之前先給大家講一個我們使用手機的一個場景,我們都用過手機,當我們手機來電話的時候,會有各種複雜的操作,比如會響鈴、手機震動、螢幕會亮屏等等,大家有沒有考慮過這個場景是怎麼實現的呢?其實這個地方就是使用了觀察者設計模式。
在上述例子中,如果不使用代理設計模式,要怎麼設計比較合理,任何一種設計模式的出現都有它使用的場景,這都是歷經多少前輩的經驗總結出來的,觀察者設計模式也不例外
觀察者模式的應用場景:
1、 對一個物件狀態的更新,需要其他物件同步更新,而且其他物件的數量動態可變。
2、 物件僅需要將自己的更新通知給其他物件而不需要知道其他物件的細節。
定義
觀察者模式(有時又被稱為釋出-訂閱Subscribe>模式、模型-檢視View>模式、源-收聽者Listener>模式或 從屬者模式)是軟體設計模式的一種。在此種模式中,一個目標物件管理所有相依於它的觀察者物件,並且在它本身的狀態改變時主動發出通知。這通常透過呼叫各 觀察者所提供的方法來實現。此種模式通常被用來實現事件處理系統。
UML圖
觀察者設計模式主要包括以下三個部分:
1,事件
2,事件源
3,觀察者(監聽者)
上述的例子中,事件(來電);事件源(call);觀察者(螢幕相應物件、響鈴相應物件、震動相應物件等),這些觀察者就是訂閱了call的狀態,當call的狀態變成來電時,這些觀察者就能收到相應的資訊,然後做一些更新的操作。
程式碼設計
CallObserverable.java
package mode.observe;
/**
* @author hongtaolong
* 抽象的被觀察的介面
*/
public interface CallObserverable {
public void registerObserver(CallStateListener o);//訂閱
public void removeObserver(CallStateListener o);//刪除訂閱
public void notifyObserver();//通知
}
CallStateListener.java
package mode.observe;
/**
* @author hongtaolong
* call狀態監聽的介面
*/
public interface CallStateListener {
void update();
}
CallRing.java
package mode.observe;
/**
* @author hongtaolong
* 響鈴相關的類
*/
public class CallRing implements CallStateListener {
@Override
public void update() {
// TODO Auto-generated method stub
System.out.println("來電話了,我要響鈴了");
}
}
CallScreen.java
package mode.observe;
/**
* @author hongtaolong
* 響鈴相關的類
*/
public class CallScreen implements CallStateListener {
@Override
public void update() {
// TODO Auto-generated method stub
System.out.println("來電話了,我要亮屏");
}
}
CallShock.java
package mode.observe;
/**
* @author hongtaolong
* 震動相關的類
*/
public class CallShock implements CallStateListener {
@Override
public void update() {
// TODO Auto-generated method stub
System.out.println("來電話了,我要震動了");
}
}
CallState.java
package mode.observe;
import java.util.ArrayList;
import java.util.List;
/**
* @author hongtaolong
* call狀態類
*/
public class CallState implements CallObserverable{
private int state;//call的狀態
private List<CallStateListener> mCallListeners;
public CallState() {
// TODO Auto-generated constructor stub
mCallListeners = new ArrayList<>();
}
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
//為了方便在這裡進行簡單的改變call的狀態,設定當state = 2表示來電話
if(state == 2) {
notifyObserver();//通知觀察者
}
}
@Override
public void registerObserver(CallStateListener o) {
// TODO Auto-generated method stub
mCallListeners.add(o);
}
@Override
public void removeObserver(CallStateListener o) {
// TODO Auto-generated method stub
mCallListeners.remove(o);
}
@Override
public void notifyObserver() {
// TODO Auto-generated method stub
for(CallStateListener listener : mCallListeners) {
listener.update();
}
}
}
CallClient.java
package mode.observe;
/**
* @author hongtaolong
* 客戶端
*/
public class CallClient {
public static void main(String[] args) {
CallStateListener shock = new CallShock();
CallStateListener screen = new CallScreen();
CallStateListener ring = new CallRing();
CallState callState = new CallState();
callState.registerObserver(screen);//screen訂閱call的狀態
callState.registerObserver(shock);//shock訂閱call狀態
callState.registerObserver(ring);//ring訂閱call狀態
callState.setState(2);//模擬2表示來電
}
}
執行結果:
觀察者設計模式是不是非常簡單,本文如有錯誤之處,歡迎指出,謝謝!java