設計模式之觀察者模式

這裏寫圖片描述

實現代碼(推的方式)

目標對象

public class Subject {

    protected List<Observer> list = new ArrayList<Observer>();

    public void registerObserver(Observer obs){
        list.add(obs);
    }
    public void removeObserver(Observer obs){
        list.add(obs);
    }

    //通知所有的觀察者更新狀態
    public void notifyAllObservers(){
        for (Observer obs : list) {
            obs.update(this);
        }
    }

}
public class ConcreteSubject extends Subject {

    private int state;

    public int getState() {
        return state;
    }

    public void setState(int state) {
        this.state = state;
        //主題對象(目標對象)值發生了變化,請通知所有的觀察者
        this.notifyAllObservers();
    }
}

觀察者

public interface Observer {
    void  update(Subject subject);
}
public class ObserverA implements Observer {

    private int myState;   //myState需要跟目標對象的state值保持一致!


    @Override
    public void update(Subject subject) {
        myState = ((ConcreteSubject)subject).getState();
    }


    public int getMyState() {
        return myState;
    }
    public void setMyState(int myState) {
        this.myState = myState;
    }
}

客戶端調用

public class Client {
    public static void main(String[] args) {
        //目標對象
        ConcreteSubject subject = new ConcreteSubject();

        //創建多個觀察者
        ObserverA  obs1 = new ObserverA();
        ObserverA  obs2 = new ObserverA();
        ObserverA  obs3 = new ObserverA();

        //將這三個觀察者添加到subject對象的觀察者隊伍中
        subject.registerObserver(obs1);
        subject.registerObserver(obs2);
        subject.registerObserver(obs3);


        //改變subject的狀態
        subject.setState(3000);
        System.out.println("########################");
        //我們看看,觀察者的狀態是不是也發生了變化
        System.out.println(obs1.getMyState());
        System.out.println(obs2.getMyState());
        System.out.println(obs3.getMyState());

        //改變subject的狀態
        subject.setState(30);
        System.out.println("########################");
        //我們看看,觀察者的狀態是不是也發生了變化
        System.out.println(obs1.getMyState());
        System.out.println(obs2.getMyState());
        System.out.println(obs3.getMyState());
    }
}

類圖

這裏寫圖片描述

Javase提供的類來實現觀察者模式

java.util.observable和java.util.observer

//目標對象
public class ConcreteSubject extends Observable {

    private int state; 

    public void set(int s){
        state = s;  //目標對象的狀態發生了改變

        setChanged();  //表示目標對象已經做了更改
        notifyObservers(state);  //通知所有的觀察者

    }

    public int getState() {
        return state;
    }

    public void setState(int state) {
        this.state = state;
    }

}
public class ObserverA implements Observer {

    private int myState;


    @Override
    public void update(Observable o, Object arg) {
        myState = ((ConcreteSubject)o).getState();
    }


    public int getMyState() {
        return myState;
    }


    public void setMyState(int myState) {
        this.myState = myState;
    }
}
public class Client {
    public static void main(String[] args) {
        //創建目標對象Obserable
        ConcreteSubject subject = new ConcreteSubject();

        //創建觀察者
        ObserverA obs1 = new ObserverA();
        ObserverA obs2 = new ObserverA();
        ObserverA obs3 = new ObserverA();

        //將上面三個觀察者對象添加到目標對象subject的觀察者容器中
        subject.addObserver(obs1);
        subject.addObserver(obs2);
        subject.addObserver(obs3);

        //改變subject對象的狀態
        subject.set(3000);
        System.out.println("===============狀態修改了!");
        //觀察者的狀態發生了變化
        System.out.println(obs1.getMyState());
        System.out.println(obs2.getMyState());
        System.out.println(obs3.getMyState());

        subject.set(600);
        System.out.println("===============狀態修改了!");
        //觀察者的狀態發生了變化
        System.out.println(obs1.getMyState());
        System.out.println(obs2.getMyState());
        System.out.println(obs3.getMyState());      

    }
}

這裏寫圖片描述

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