多線程之觀察者模式

觀察監視某個主題的狀態,通知其他監視者。

//主題對象(被觀察的對象)
public class Subject {
    //觀察者集合
    private List<Observer> observers = new ArrayList<>();
    //設置狀態變化的標識
    private int state;
    //將觀察者加入集合中
    public void attach(Observer observer) {
        observers.add(observer);
    }
    public int getState() {
        return this.state;
    }
    public void setState(int state) {
        //如果state沒有變化,折返回。
        if (state == this.state) {
            return;
        }
        //當state變化時,將state設置爲要改變的值,並通知所有觀察者。
        this.state = state;
        notifyAllObserver();
    }
    //通知所有觀察者的方法
    private void notifyAllObserver() {
        observers.stream().forEach(Observer::update);
    }
}

 

//觀察者接口
public abstract class Observer {
    protected Subject subject;
    public Observer(Subject subject) {
        this.subject = subject;
        //調用subject的方法,將觀察者加入到觀察集合中。
        this.subject.attach(this);
    }
    //通知用戶
    public abstract void update();
}
//觀察者實現
public class Jun_Observer extends Observer {
    public Jun_Observer(Subject subject) {
        super(subject);
    }

    @Override
    public void update() {
        System.out.println("Jun觀察到主題的state有變化,變爲:" + subject.getState());
    }
}

//觀察者實現
public class Soutn_Observer extends Observer{
    public Soutn_Observer(Subject subject) {
        super(subject);
    }

    @Override
    public void update() {
        System.out.println("South觀察到主題的state有變化,變爲:" + subject.getState());
    }
}

Test_Main

    public static void main(String[] args) {
        //創建要觀察的對象
        final Subject subject = new Subject();
        //創建Jun_Observer觀察者
        new Jun_Observer(subject);
        //創建Soutn_Observer觀察者
        new Soutn_Observer(subject);

        subject.setState(100);
        subject.setState(200);
        subject.setState(300);
    }

 

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