首頁  >  文章  >  Java  >  JAVA怎樣實現觀察者模式

JAVA怎樣實現觀察者模式

WBOY
WBOY轉載
2023-04-18 09:15:271928瀏覽

概念

觀察者模式又叫做發布-訂閱模式,是物件間的一對多的關係,當一個物件的狀態改變時,所有依賴它的物件都會被通知並被自動更新

組成 

#抽象主題角色(Subject

也叫抽象目標類,抽象主題知道自己的觀察者有哪些,提供刪除和新增觀察者的方法以及通知觀察者的抽象方法,由抽象類別或介面實作

抽象觀察者角色(Observer#)

包含了一個更新的抽象方法,當收到特定主題的更新通知後調用,由抽象類別或介面實作

具體主題角色(Concrete Subject#)

也叫具體目標類,實現抽象目標類的通知方法,當具體主題發生改變時通知所有訂閱自己的觀察者

具體觀察者角色(Concrete Observer

#實作抽象觀察者角色的抽象方法,收到主題變更通知後變更自身狀態

JAVA怎樣實現觀察者模式

實作 

抽象觀察者Observer介面

包含一個觀察者接收通知改變自身狀態方法

public interface Observer {
	//收到通知,改变自身状态
    void update();
}

#具體觀察者ObserverOneObserverTwo

實作Observer介面中的update方法

public class ObserverOne implements Observer{
    @Override
    public void update() {
        System.out.println("第一个观察者收到通知,状态更新了");
    }
}
public class ObserverTwo implements Observer {
    @Override
    public void update() {
        System.out.println("第二个观察者收到通知,状态更新了");
    }
}

#Subject介面

包含新增,刪除,通知觀察者方法,由抽象目標類別實現,還有一個自身操作的方法,由具體目標類別實現

public interface Subject {
    //添加观察者
    void add(Observer observer);
    //删除观察者
    void remove(Observer observer);
    //通知所有观察者
    void notifyObservers();
    //自身操作
    void operation();
}

抽象目標類別AbstractSubject

##抽象類別,因為觀察者數量不固定,所以使用

Vector動態數組儲存觀察者,實作Subject介面中的add,remove,notifyObservers方法,operation方法由具體目標類別實作

public abstract class AbstractSubject implements Subject{
    Vector<Observer> vector = new Vector<Observer>();
    @Override
    public void add(Observer observer){
        vector.add(observer);
    }
    @Override
    public void remove(Observer observer){
        vector.remove(observer);
    }
    @Override
    public void notifyObservers(){
        for (Observer observer : vector) {
            observer.update();
        }
    }
}

具體目標類別MySubject

#繼承AbstractSubject類,實作operation方法,並

在operation方法中呼叫notifyObservers方法以達到自身狀態改變後通知觀察者的效果

public class MySubject extends AbstractSubject{
    @Override
    public void operation() {
        System.out.println("具体目标状态改变");
        System.out.println("正在通知观察者。。。");
        notifyObservers();
        System.out.println("通知完毕!");
    }
}

測試類別Test

public class Test {
    public static void main(String[] args) {
        MySubject mySubject = new MySubject();
        mySubject.add(new ObserverOne());
        mySubject.add(new ObserverTwo());
        mySubject.operation();
    }
}

JAVA怎樣實現觀察者模式

總結 

觀察者模式主要解決了什麼問題

在低耦合的條件下,一個物件狀態改變,其他物件會收到通知

#觀察者模式何時使用

一個物件狀態改變,所有有依賴關係的物件都會收到廣播通知

觀察者模式的優點

觀察者和目標是抽象耦合的,低耦合,是一套觸發機制

#觀察者模式的缺點

##①如果一個目標中依賴的直接觀察者和間接觀察者有很多的話,通知所有觀察者需要花費很多時間

  • ②如果觀察者和被觀察者之間有循環依賴的話,可能會出現循環調用,導致系統崩潰

  • ③觀察者無法知道目標狀態是如何變化的,只能知道目標狀態發生了改變

  • 觀察者模式的注意事項
##########①JAVA中已經有了觀察者模式的支持類,可以直接使用## ##########②避免循環呼叫############③如果順序執行觀察者的更新方法,某一觀察者錯誤會導致系統卡住,一般採用非同步方式。 ##########

以上是JAVA怎樣實現觀察者模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除