java設計模式(行爲型)之觀察者模式

第0章:簡介

觀察者模式定義:定義對象間的一種一對多的依賴關係。當一個對象的狀態發生改變時,所有依賴於它的對象都得到通知並被自動更新

觀察者模式本質:觸發聯動

參考:http://chjavach.iteye.com/blog/1632211研磨設計模式(書籍),大話設計模式(書籍)

模式圖:

待補充

第1章:實踐

第0節:觀察者模式(拉模式)

(1)目標對象,被觀察者(Target.java)

package com.mcc.core.designPattern.behavior.observer.dragObserver;

import java.util.ArrayList;
import java.util.List;

/**
 * 目標對象,被觀察者
 *
 * @author <a href="mailto:[email protected]">menergy</a>
 *         DateTime: 14-3-15  下午3:32
 */
public class Target {

    //持有所有註冊的觀察者對象
    private List<Observer> observerList = new ArrayList<Observer>();

    //增加觀察者對象
    public void addObserver(Observer observer){
        observerList.add(observer);
    }

    //移除觀察者對象
    public void removeObserver(Observer observer){
        observerList.remove(observer);
    }

    /**
     * 通知所有註冊的觀察者對象
     */
    protected void notifyObservers(){
        for(Observer observer : observerList){
            observer.update(this);
        }
    }
}

(2)目標對象子類(TargetExtends.java)

package com.mcc.core.designPattern.behavior.observer.dragObserver;

/**
 * 目標對象子類,被觀察者,管理狀態變化
 *
 * @author <a href="mailto:[email protected]">menergy</a>
 *         DateTime: 14-3-15  下午3:43
 */
public class TargetExtends extends Target {

    //目標對象狀態
    private String targetState;

    public String getTargetState() {
        return targetState;
    }

    public void setTargetState(String targetState) {
        this.targetState = targetState;
        //狀態發生了變化,通知各觀察者對象
        this.notifyObservers();
    }
}

(3)觀察者接口(Observer.java)

package com.mcc.core.designPattern.behavior.observer.dragObserver;

/**
 * 觀察者接口,拉模型,主動權爲觀察者,被觀察者負責通知狀態改變
 *
 * 觀察者模式的定義:定義對象間的一種一對多的依賴關係。當一個對象的狀態發生改變時,所有依賴於它的對象都得到通知並被自動更新
 * 觀察者模式的本質:觸發聯動
 *
 * @author <a href="mailto:[email protected]">menergy</a>
 *         DateTime: 14-3-15  下午3:35
 */
public interface Observer {

    /**
     * 目標對象,更新觀察結果,可加入其它操作
     * @param target
     */
    public void update(Target target);
}

(4)觀察者A(ObserverImplA.java)

package com.mcc.core.designPattern.behavior.observer.dragObserver;

/**
 * 觀察者A
 *
 * @author <a href="mailto:[email protected]">menergy</a>
 *         DateTime: 14-3-15  下午3:48
 */
public class ObserverImplA implements Observer {
    /**
     * 拉模型,觀察者感應到目標對象發生變化,消息必須自己去獲取
     * @param target
     */
    @Override
    public void update(Target target) {
        System.out.println("觀察者A收到目標狀態信息:" +((TargetExtends)target).getTargetState()+ ",執行相應操作");
    }
}

(5)觀察者B(ObserverImplB.java)

package com.mcc.core.designPattern.behavior.observer.dragObserver;

/**
 * 觀察者B
 *
 * @author <a href="mailto:[email protected]">menergy</a>
 *         DateTime: 14-3-15  下午3:58
 */
public class ObserverImplB implements Observer {
    /**
     * 拉模型,觀察者感應到目標對象發生變化,消息必須自己去獲取
     * @param target
     */
    @Override
    public void update(Target target) {
        System.out.println("觀察者B收到目標狀態信息:" +((TargetExtends)target).getTargetState()+ ",執行相應操作");
    }
}

(6)客戶端測試(Client.java)

package com.mcc.core.designPattern.behavior.observer.dragObserver;

/**
 * 客戶端測試
 *
 * @author <a href="mailto:[email protected]">menergy</a>
 *         DateTime: 14-3-15  下午3:58
 */
public class Client {

    public static void main(String args[]){
        //目標對象,被觀察者
        TargetExtends target = new TargetExtends();

        //觀察者
        Observer observerA = new ObserverImplA();
        Observer observerB = new ObserverImplB();

        //註冊觀察者
        target.addObserver(observerA);
        target.addObserver(observerB);

        //被觀察者更新狀態
        target.setTargetState("【已經發布,請查收】");


    }
}

第1節:觀察者模式(推模式)

(1)目標對象,被觀察者(Target.java)

package com.mcc.core.designPattern.behavior.observer.pushObserver;

import java.util.ArrayList;
import java.util.List;

/**
 * 目標對象,被觀察者
 *
 * @author <a href="mailto:[email protected]">menergy</a>
 *         DateTime: 14-3-15  下午3:32
 */
public class Target {

    //持有所有註冊的觀察者對象
    private List<Observer> observerList = new ArrayList<Observer>();

    //增加觀察者對象
    public void addObserver(Observer observer){
        observerList.add(observer);
    }

    //移除觀察者對象
    public void removeObserver(Observer observer){
        observerList.remove(observer);
    }

    /**
     * 通知所有註冊的觀察者對象
     */
    protected void notifyObservers(String message){
        for(Observer observer : observerList){
            observer.update(message);
        }
    }
}

(2)目標對象子類(TargetExtends.java)

package com.mcc.core.designPattern.behavior.observer.pushObserver;

/**
 * 目標對象子類,被觀察者,管理狀態變化
 *
 * @author <a href="mailto:[email protected]">menergy</a>
 *         DateTime: 14-3-15  下午3:43
 */
public class TargetExtends extends Target {

    //消息
    private String message;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
        //通知並推送消息給觀察者
        this.notifyObservers(message);
    }
}

(3)觀察者接口(Observer.java)

package com.mcc.core.designPattern.behavior.observer.pushObserver;

/**
 * 觀察者接口,推模型,主動權爲目標對象
 *
 * 觀察者模式的定義:
 *
 * @author <a href="mailto:[email protected]">menergy</a>
 *         DateTime: 14-3-15  下午3:35
 */
public interface Observer {

    /**
     * 目標對象,更新觀察結果,可加入其它操作
     * @param message 推送的消息
     */
    public void update(String message);
}

(4)觀察者A(ObserverImplA.java)

package com.mcc.core.designPattern.behavior.observer.pushObserver;

/**
 * 觀察者A
 *
 * @author <a href="mailto:[email protected]">menergy</a>
 *         DateTime: 14-3-15  下午3:48
 */
public class ObserverImplA implements Observer {
    /**
     * 推模型,消息直接被目標對象推送過來
     * @param message
     */
    @Override
    public void update(String message) {
        System.out.println("觀察者A收到推送過來的消息:" + message + ",執行相應操作");
    }
}

(5)觀察者B(ObserverImplB.java)

package com.mcc.core.designPattern.behavior.observer.pushObserver;

/**
 * 觀察者B
 *
 * @author <a href="mailto:[email protected]">menergy</a>
 *         DateTime: 14-3-15  下午3:58
 */
public class ObserverImplB implements Observer {
    /**
     * 推模型,消息直接被目標對象推送過來
     * @param message
     */
    @Override
    public void update(String message) {
        System.out.println("觀察者B收到推送過來的消息:" + message + ",執行相應操作");
    }
}

(6)客戶端測試(Client.java)

package com.mcc.core.designPattern.behavior.observer.pushObserver;

/**
 * 客戶端測試
 *
 * @author <a href="mailto:[email protected]">menergy</a>
 *         DateTime: 14-3-15  下午3:58
 */
public class Client {

    public static void main(String args[]){
        //目標對象,被觀察者
        TargetExtends target = new TargetExtends();

        //觀察者
        Observer observerA = new ObserverImplA();
        Observer observerB = new ObserverImplB();

        //註冊觀察者
        target.addObserver(observerA);
        target.addObserver(observerB);

        //推送消息
        target.setMessage("【消息:今天會議取消】");

    }
}


第2節:觀察者模式(java自帶)

(1)目標對象(Targeter.java)

package com.mcc.core.designPattern.behavior.observer.javaObserver;

import java.util.Observable;

/**
 * 目標對象,java方式實現
 *
 * @author <a href="mailto:[email protected]">menergy</a>
 *         DateTime: 14-3-15  下午4:23
 */
public class Targeter extends Observable {

    //消息
    private String message;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
        //設置狀態,java自帶實現
        this.setChanged();
        //主動通知觀察者,java自帶實現,推方式
        this.notifyObservers(this.message);
//        //主動通知觀察者,java自帶實現,拉方式
//        this.notifyObservers();

    }
}

(2)觀察者A(ObserverA.java)

package com.mcc.core.designPattern.behavior.observer.javaObserver;

import java.util.Observable;
import java.util.Observer;

/**
 * 觀察者A,java實現方式
 *
 * @author <a href="mailto:[email protected]">menergy</a>
 *         DateTime: 14-3-15  下午4:29
 */
public class ObserverA implements Observer {
    /**
     * 處理更新
     * @param o
     * @param arg
     */
    @Override
    public void update(Observable o, Object arg) {
        //推方式需要在目標對象中調用notifyObservers帶參數的方法,否則這裏的org會是null
        System.out.println("觀察者A收到推送過來的消息:" + arg + ",執行相應操作");
        //拉方式是默認的模型,目標對象中調用有參數或無參數的notifyObservers都可以
        System.out.println("觀察者A拉到消息:" + ((Targeter)o).getMessage() + ",執行相應操作");
    }
}

(3)觀察者B(ObserverB.java)

package com.mcc.core.designPattern.behavior.observer.javaObserver;

import java.util.Observable;
import java.util.Observer;

/**
 * 觀察者B,java實現方式
 *
 * @author <a href="mailto:[email protected]">menergy</a>
 *         DateTime: 14-3-15  下午4:44
 */
public class ObserverB implements Observer {

    /**
     * 處理更新
     * @param o
     * @param arg
     */
    @Override
    public void update(Observable o, Object arg) {
        //推方式需要在目標對象中調用notifyObservers帶參數的方法,否則這裏的org會是null
        System.out.println("觀察者B收到推送過來的消息:" + arg + ",執行相應操作");
        //拉方式是默認的模型,目標對象中調用有參數或無參數的notifyObservers都可以
        System.out.println("觀察者B拉到消息:" + ((Targeter)o).getMessage() + ",執行相應操作");
    }
}

(4)客戶端測試(Client.java)

package com.mcc.core.designPattern.behavior.observer.javaObserver;

/**
 * 客戶端測試
 *
 * @author <a href="mailto:[email protected]">menergy</a>
 *         DateTime: 14-3-15  下午4:45
 */
public class Client {

    public static void main(String args[]){
        //目標對象,被觀察者
        Targeter targeter = new Targeter();

        //觀察者
        ObserverA observerA = new ObserverA();
        ObserverB observerB = new ObserverB();

        //註冊觀察者
        targeter.addObserver(observerA);
        targeter.addObserver(observerB);

        //推送消息
        targeter.setMessage("【消息:今天會議取消】");


    }
}


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