設計模式:行爲模式 - 觀察者模式

觀察者模式定義了一對多的依賴關係,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象發生改變時,會通知所有觀察者對象,使他們能夠自動更新自己

缺點:需要維護相關對象間的一致性。我們不希望爲了維持一致性而使各類緊密耦合,這樣會給維護、擴展和重用都帶來不便

優點:相互耦合,讓耦合的雙方都依賴於抽象,而不是具體依賴於具體,從而使得各自的變化都不會影響另一邊的變化

 

觀察者類一般有增加觀察者。減少觀察者,通知,通知者狀態四個方法。

其他類實現觀察這類四個方法

 

UML:

 

JAVA:

public class ObserverTest {
    public static void main(String[] args) {
        Boss boss = new Boss();
        Observer observer1 = new StockObserver("lili",boss);//lili,觀察boss
        Observer observer2 = new StockObserver("lilei",boss);//lilei,觀察boss

        boss.attach(observer1);
        boss.attach(observer2);
        boss.detach(observer2);
        boss.setSubjectState(true);
        boss.notifying();
    }
}

//抽象觀察者
abstract class Observer{
    protected String name;
    protected Subject sub;

    public Observer(String name, Subject sub) {
        this.name = name;
        this.sub = sub;
    }

    public abstract void Update();
}
//例如看股票的同事 在觀察老闆有沒有回來
class StockObserver extends Observer{
    public StockObserver(String name, Subject sub) {
        super(name, sub);
    }

    @Override
    public void Update() {
        System.out.println(sub.getSubjectState()+" "+name+" 關閉股票行情,繼續工作");
    }
}
//通知者
interface Subject{
    void attach(Observer observer);
    void detach(Observer observer);
    void notifying();
    boolean getSubjectState();
    void setSubjectState(boolean subjectState);
}
class Boss implements Subject{
    List<Observer> observers = new ArrayList<>();
    boolean subjectState = false; //true在,false不在
    @Override
    public void attach(Observer observer) {
        observers.add(observer);
    }

    @Override
    public void detach(Observer observer) {
        observers.remove(observer);
    }

    @Override
    public void notifying() {
        for (Observer o:observers ) {
            o.Update();
        }
    }

    @Override
    public boolean getSubjectState() {
        return subjectState;
    }

    @Override
    public void setSubjectState(boolean subjectState) {
        this.subjectState = subjectState;
    }
}

 

 

 

 

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