1. 程式人生 > >Java用觀察者模式重構複雜的業務程式碼

Java用觀察者模式重構複雜的業務程式碼

1. 定義一個統一的回撥介面

public interface CallerInter {
    void call(Param param);
}
2. 定義觀察者介面
public interface ObserverInter{
    /**
     * 增加觀察者
     *
     * @param callInter
     */
    void addObserver(CallerInter callInter);

    /**
     * 刪除觀察者
     *
     * @param lemmaWriteBackOpObserver
     */
    void delObserver(CallerInter callInter);

    /**
     * 通知觀察者
     *
     * @param lemmaRecord
     */
    void notifyAllObserver(Param param);
}

3. 定義觀察者實現類
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * Created by denglinjie on 2016/8/19.
 */
@Service
public class ObserverImpl implements ObserverInter, InitializingBean {

    //要通知的物件列表
    private List<CallerInter> callerInterList;

    public void addObserver(CallerInter callInter) {
        callerInterList.add(callInter);
    }

    public void delObserver(CallerInter callInter) {
        callerInterList.remove(callInter);
    }

    public void notifyAllObserver(Param param) {
        for(CallerInter callerInter : callerInterList) {
            callerInter.call(param);
        }
    }

    public void afterPropertiesSet() throws Exception {
        callerInterList = new CopyOnWriteArrayList<CallerInter>();  //這裡用一個執行緒安全的list,因為可能多執行緒同時操作它
    }

    /**
     * 對外提供一個介面,當這個介面被呼叫的時候,可以通知所有註冊進來的物件的特定call介面
     */
    public void operateService() {
        //構造引數
        Param param = new Param();
        notifyAllObserver(param);
    }
}

4. 定義兩個要被觀察的物件,需要把自己註冊到觀察者列表中,即上述ObserImpl的callInterList集合中
import com.sogou.study.observer.CallerInter;
import com.sogou.study.observer.ObserverInter;
import com.sogou.study.observer.Param;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * Created by denglinjie on 2016/8/19.
 */
public class CallImplFirst implements CallerInter, InitializingBean {

    @Autowired
    private ObserverInter observerInter;

    public void call(Param param) {
        //do something
    }

    public void afterPropertiesSet() throws Exception {
        observerInter.addObserver(this);
    }
}

import com.sogou.study.observer.CallerInter;
import com.sogou.study.observer.ObserverInter;
import com.sogou.study.observer.Param;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * Created by denglinjie on 2016/8/19.
 */
public class CallImplSecond implements CallerInter, InitializingBean {

    @Autowired
    private ObserverInter observerInter;

    public void call(Param param) {
        //do something
    }

    public void afterPropertiesSet() throws Exception {
        observerInter.addObserver(this);
    }
}

5. 這樣其他業務呼叫ObserverImpl的operateService方法時,就可以通知所有的註冊的物件做一些事情。當一個業務邏輯很複雜要做很多事情的時候,如果把程式碼寫在一起會顯得很擁擠,不利於維護,這時,可以通過這種觀察者模式,將不同的業務處理區分開。

相關推薦

Java觀察模式重構複雜業務程式碼

1. 定義一個統一的回撥介面 public interface CallerInter { void call(Param param); } 2. 定義觀察者介面 public interface ObserverInter{ /** *

觀察模式,傳遞廣播中收的值

前言: 最近專案中有用到廣播,需要接收到廣播傳過來的值,在指定頁面上使用是不是很簡單呢,沒錯,這時候有人說可以寫區域性廣播啊,哪個頁面需要用到哪個頁面寫廣播啊,沒錯這的確是一個方法,但是如果說有五個頁面你能五個都寫麼。這時候又會有人說,那就用全域性啊,對 小白就是用的全域性。那麼我們如

使用工廠模式和策略模式重構複雜業務邏輯

專案組在和外部系統對接,花了好長一段時間對以前的列印邏輯做修改,修改了8次的bug,才實現了當前的外接系統的列印功能,上線的前一刻又發現此次的改動對以前的邏輯產生關聯影響,哎,不談了,原因很簡單,隨著外接系統的增多,實現的列印方式和功能已經很多了,而此時幾千行的程式碼看看已

java觀察模式

觀察者模式(Observer) 包括這個模式在內的接下來的四個模式,都是類和類之間的關係,不涉及到繼承,學的時候應該 記得歸納 ,記得本文最開始的那個圖。觀察者模式很好理解,類似於郵件訂閱和RSS訂閱, 當我們瀏覽一些部落格或wiki時,經常會看到RSS圖示,就這的意思是,

Android觀察模式代替廣播通知重新整理介面

原始碼下載我們知道廣播是誇程序的,所以不能什麼時候都用廣播,如果涉及到安全問題就最好別用廣播,怕其他應用程序監聽到你的廣播。這裡採用介面去實現廣播的功能。 下面看實現程式碼: 1.首先我定義一個介面 package com.cn.interfacecallbackbro

Java觀察模式總結

一、 總體大綱 二、觀察者模式定義 出版者 + 訂閱者  = 觀察者模式 觀察者模式:定義了物件之間的一對多依賴,這樣一來,當一個物件改變狀態時,它的所有依賴者都會受到通知並自動更新。 三、設計原則 為了互動物件之間的鬆耦合設計而努力 四、例項說明 1. 實

Java 觀察模式的淺析

簡單地說,觀察者模式定義了一個一對多的依賴關係,讓一個或多個觀察者物件監察一個主題物件。這樣一個主題物件在狀態上的變化能夠通知所有的依賴於此物件的那些觀察者物件,使這些觀察者物件能夠自動更新。  觀察者模式的結構  觀察者(Observer)模式是物件的行為型模式,又叫做發表

Java觀察模式

本文是《【C++】觀察者模式》(點選開啟連結)的Java實現,關於什麼是觀察者模式這裡就不將了,只是從類圖為視覺重新審視這條2014年上半年的軟體設計師的軟考題。 題目是這樣的: 某實驗室欲建立一個實驗室的環境監測系統,能夠顯示實驗室的溫度、溼度以及潔淨度等環境資料,當獲

java觀察模式解耦經典三層架構

三層架構是一個非常經典的架構模式,根據系統的職責不同,將系統分成了表現層,邏輯層和資料訪問層,並且配合資料實體進行資料傳輸,可以大大的封裝性和複用性。 經典的三層架構圖: 我們再深入到架構圖內部,看看具體的類圖,用簡單的登陸舉例吧: 這裡通過LoginUI,呼叫了Log

java觀察模式

sta ray equals system clas tde team oid 東方 觀察者設定一個觀察目標,根據觀察目標的變化,觀察者采取相應的應對行為---觀察者模式 1 //玩家類 2 public class Player { 3 4

Java設計模式補充:回調模式、事件監聽器模式觀察模式(轉)

應該 hand 關閉 lan china 關註 update 使用 event 一、回調函數 為什麽首先會講回調函數呢?因為這個是理解監聽器、觀察者模式的關鍵。 什麽是回調函數 所謂的回調,用於回調的函數。 回調函數只是一個功能片段,由用戶按照回調函數調用約定來實現的

淺談java中內置的觀察模式與動態代理的實現

所有 代理 notify play ani effect 一個 indicate protected 一.關於觀察者模式 1.將觀察者與被觀察者分離開來,當被觀察者發生變化時,將通知所有觀察者,觀察者會根據這些變化做出對應的處理。 2.jdk裏已經提供對應的Observer

Java 設計模式 觀察模式

例如 null 可能 truct pri color img cte bstr   在閻宏博士的《JAVA與模式》一書中開頭是這樣描述觀察者(Observer)模式的:觀察者模式是對象的行為模式,又叫發布-訂閱(Publish/Subscribe)模式、模型-視圖(Mode

JAVA設計模式觀察模式

設計原則 設計模式 測試類 stat tin 正常 san date() 觀察者模式 轉載請註明出處:https://www.cnblogs.com/luohanguo/p/7825656.html 1、初步認識 觀察者模式的定義:   在對象之間定義了一對多的依賴

Java設計模式---------觀察模式

個人 api 如果 修改 沒有 zed return pla 細節 以下內容主要來自《HeadFirst設計模式》一書和博文:http://www.cnblogs.com/xrq730/p/4908686.html,僅作為個人的學習筆記使用。 觀察者模式 定義了對象之間的一

java 觀察模式

gis ray bubuko 依賴 rabl rem 例子 mov 如果 觀察者模式又稱為發布/訂閱(Publish/Subscribe)模式,因此我們可以用報紙期刊的訂閱來形象的說明:     報社方負責出版報紙.     你訂閱了該報社的報紙,那麽只要報社發布了新報紙,

Java 設計模式系列(十六)觀察模式(Observer)

for out 其中 如果 observer 業務 ets 同時 hang Java 設計模式系列(十六)觀察者模式(Observer) 觀察者模式是對象的行為模式,又叫發布-訂閱(Publish/Subscribe)模式、模型-視圖(Model/View)模式、源-監聽

Java常用設計模式——觀察模式

ray stat param servers face oid println override 角色 觀察者模式又叫做發布-訂閱-模式、模型-視圖-模式、源-監聽器-模式或者從屬者模式。觀察者模式定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽某一個主題對

Java 設計模式觀察模式

float stock chan bject 17. sta chang eth int http://www.verejava.com/?id=16999149610674 package com.observer.theory; public class Test {

java設計模式3--觀察模式

san 制圖 同時 限制 tar int 構圖 所有 fomat 觀察者模式的定義:   在對象之間定義了一對多的依賴,這樣一來,當一個對象改變狀態,依賴它的對象會收到通知並自動更新。 大白話:   其實就是發布訂閱模式,發布者發布信息,訂閱者獲取信息,訂閱了就能收到信息,