使用觀察者模式實現EventBus功能

1.首先定義觀察者

/**
 * 觀察者
 */
public interface ObServer {

     //觀察數據
     void update(String data);
}

2.定義操作觀察者的對象

public class ObserverObject {

    private static volatile ObserverObject sinstance = null; // <<< 這裏添加了 Appsinstance
    private static CommonObservable<ObServer> applicationSubject;

    public CommonObservable<ObServer> getObserviceSubject() {
        if(applicationSubject == null) applicationSubject = new CommonObservable<>();
        return applicationSubject;
    }

    /**
     * 初始化類
     * @return
     */
    public static ObserverObject getSdkInstance() {
        ObserverObject inst = sinstance;  // <<< 在這裏創建臨時變量
        if (inst == null) {
            synchronized (ObserverObject.class) {
                inst = sinstance;
                if (inst == null) {
                    inst = new ObserverObject();
                    sinstance = inst;
                }
            }
        }
        return inst;  // <<< 注意這裏返回的是臨時變量
    }
}

3.設置觀察者的操作

public abstract class Observable<T> {

    public final  ArrayList<HashMap<String, T>> obserList = new ArrayList<HashMap<String,T>>();

    /* 添加觀察者 包括名稱及本生 */
    public void attachObserver(String obName, T ob) {
        if(obName == null || ob == null) throw new NullPointerException();
        synchronized(obserList) {
            HashMap<String, T> map = new HashMap<String, T>();
            map.put(obName, ob);
            int index = obserList.indexOf(map);
            if(index == -1) {
                obserList.add(map);
            }
        }
    }
    /* 刪除觀察者 */
    public void detachObserver(String obName) {
        if(obName == null) throw new NullPointerException();
        synchronized(obserList){
            Iterator<HashMap<String, T>> iteratorMap = obserList.iterator();
            while(iteratorMap.hasNext()) {
                Iterator<Entry<String, T>> iterator = iteratorMap.next().entrySet().iterator();
                while(iterator.hasNext()){
                    if(iterator.next().getKey().equals(obName)){
                        iteratorMap.remove();
                        break;
                    }
                }
            }
        }
    }

    /** detach all observers */
    public void detachObservers() {
        synchronized(obserList) {
            obserList.removeAll(obserList);
        }
    }

    /** Ruturn the size of observers */
    public int countObservers() {
        synchronized(obserList) {
            return obserList.size();
        }
    }

    public abstract void notifyObserver(String data);

    public abstract void notifyObserver(String obserName, boolean flag, String s);
}

4.實現

public class CommonObservable<T extends ObServer> extends Observable<T> {
    /** 實現抽象方法通知觀察者,
     * 第一個參數爲觀察者名字,
     * 第二個參數flag標誌表示如果沒有找到觀察者是否通知其他所有觀察者(true是false否),
     * 第三個爲需要傳遞的參數
    */
    String test="";
    @Override
    public void notifyObserver(String obserName, boolean flag, String s) {
        // TODO Auto-generated method stub
        if(obserName != null && !(obserName instanceof String)) return;
        for(HashMap<String, T> map : obserList){
            if(map.containsKey(obserName)) {
                ((T)map.get(obserName)).update(s);
                test=s;
                break;
            }
        }
        if(flag) {
            for(HashMap<String, T> map : obserList){
                Iterator<Entry<String, T>> iterator = map.entrySet().iterator();
                ((T)iterator.next().getValue()).update(s);
            }
        }
    }
    /**
     * 通知觀察者內容
     * 通知內容爲data,String類型
     * @param data
     */
    @Override
    public void notifyObserver(String data) {
        // TODO Auto-generated method stub
        for(HashMap<String, T> map : obserList){
            Iterator<Entry<String, T>> iterator = map.entrySet().iterator();
            ((T)iterator.next().getValue()).update(data);
        }
    }
}

 

使用示例

通過下列操作綁定觀察者

ObserverObject sdk = ObserverObject.getSdkInstance();
obserSubjet = sdk.getObserviceSubject();
obserSubjet.attachObserver("TransferJetSdk", (ObServer) this);

發送消息

if (obserSubjet != null) {
	obserSubjet.notifyObserver("StopService");
}

解綁

obserSubjet.detachObserver("TransferJetSdk");

接收數據

public class TransferJetSdk implements ObServer {

    @Override
	public void update(String data) {
		TjetLog.e("obj", "---------" + data);
    }

}

即可實現EventBus的基礎功能

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章