文章出處

使用頻率:★★★★★

一、什么是觀察者模式

一對多的關系,又叫發布-訂閱模式,即一個對象的狀態發生變化,所有依賴它的對象能夠知道該變化并自動更新;

二、補充說明

一對多:發布者是一,訂閱者是多;觀察目標是一,觀察者是多;狀態變化者是一,得到變化通知者是多;

三、角色

抽象主題

具體主題

抽象觀察者

具體觀察者

四、例子,JAVA實現

發布者為ConcreteSubject對象,PlusObserver和SubObserver為觀察者對象,接收到發布者的變化通知后分別做自增和自減操作,并打印結果;

抽象主題

package com.pichen.dp.behavioralpattern.observer;

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

public abstract class Subject {

    private List<Observer> observers = new ArrayList<Observer>();
    

    public void attach(Observer observer) {
        observers.add(observer);
    }
    
    public void detach(Observer observer){
        observers.remove(observer);
    }

    public void notifyAllObservers(double value) {
        for (Observer observer : observers) {
            observer.update(value);
        }
    }
    
    public abstract void change(double value);
}

具體主題

package com.pichen.dp.behavioralpattern.observer;


public class ConcreteSubject extends Subject{

    private double value;

    /**
     * @return the value
     */
    public double getValue() {
        return value;
    }

    /**
     * 〈一句話功能簡述〉
     * 〈功能詳細描述〉
     * @see com.pichen.dp.behavioralpattern.observer.Subject#change()
     */
    @Override
    public void change(double value) {
        this.value = value;
        System.out.println("original value:" + value);
        this.notifyAllObservers(value);
    }



    
}

抽象觀察者

package com.pichen.dp.behavioralpattern.observer;

public abstract class Observer {
    public abstract void update(double value);
}

具體觀察者

package com.pichen.dp.behavioralpattern.observer;

public class PlusObserver extends Observer {

    public PlusObserver(Subject subject) {
        subject.attach(this);
    }

    @Override
    public void update(double value) {
        System.out.println("After plus: "+ (++value));
    }
}
package com.pichen.dp.behavioralpattern.observer;

public class SubObserver extends Observer {

    public SubObserver(Subject subject) {
        subject.attach(this);
    }

    @Override
    public void update(double value) {
        System.out.println("After sub: "+ (--value));
    }
}

調用示例

package com.pichen.dp.behavioralpattern.observer;

public class Main {
    public static void main(String[] args) {
        Subject subject = new ConcreteSubject();

        new SubObserver(subject);
        new PlusObserver(subject);

        subject.change(3.0);

        subject.change(10.2);
    }
}

結果打印

original value:3.0
After sub: 2.0
After plus: 4.0
original value:10.2
After sub: 9.2
After plus: 11.2

 


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()