Java設計模式之--觀察者模式(strategy)

Java設計模式之--觀察者模式(strategy)

概念:

觀察者模式是關於多個對象想知道一個對象中數據變化情況的一種成熟模式。觀察者模式中有一個稱作“主題”的對象和若干個稱作“觀察者”的對象,“主題”和“觀察者”之間是一種一對多的依賴關係。當“主題”的狀態發生變化時,所有“觀察者”都得到通知。

場景:
類似於郵件訂閱和RSS訂閱,當我們瀏覽一些博客或wiki時,經常會看到RSS圖標,就這的意思是,當你訂閱了該文章,如果後續有更新,會及時通知你。其實,簡單來講就一句話:當一個對象變化時,其它依賴該對象的對象都會收到通知,並且隨着變化!對象之間是一種一對多的關係。

案例,某購物平臺,某品牌奶粉,被多個顧客添加關注(降低通知)當商品價格發生變化將受到通知

AbstractSubject類中定義着需要監控的對象列表,可以對其進行修改:增加或刪除被監控對象,且當它的子類變化時,負責通知在列表內存在的對象

先來看看類圖:



Observer 接口:

public interface Observer {
    public void update(String goods,double d);
}
Customer 類
public class Customer implements Observer {
    public Customer(String name) {
        setName(name);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    private String name;

    @Override
    public void update(String goods, double d) {
        System.out.println(String.format("Customer %s received that %s new price:%s", getName(), goods, d));
    }
}
Subject 接口 管理觀察者
public interface Subject {
    public Subject add(Observer observer);

    public void remove(Observer observer);

    public void notifyObservers();

    public void change(double value);

}

抽象類AbstractSubject 部分實現Subject 接口

public abstract class AbstractSubject implements Subject {
    private List<Observer> list = new ArrayList<Observer>();

    @Override
    public Subject add(Observer observer) {
        list.add(observer);
        return this;
    }

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

    @Override
    public void notifyObservers() {
        for (Observer observer : list) {
            observer.update(getName(), getPrice());
        }
    }

    public abstract String getName();

    public abstract double getPrice();
}

子類商品:
public class Goods extends AbstractSubject {
    public Goods(String name, double price) {
        this.name = name;
        this.price = price;
    }

    public void setPrice(double price) {
        this.price = price;
        notifyObservers();
    }

    private String name;
    private double price;
    @Override
    public String getName() {
        return name;
    }

    @Override
    public double getPrice() {
        return price;
    }

    @Override
    public void change(double value) {
        setPrice(value);
    }
}


測試類:
public class WorkClass {
    public void test() {
        Subject subject = new Goods("某品牌奶粉", 200.0);
        subject.add(new Customer("李雷")).add(new Customer("韓梅梅"));
        subject.change(188.0);

    }
}

輸出結果:
Customer 李雷 received that 某品牌奶粉 new price:188.0
Customer 韓梅梅 received that 某品牌奶粉 new price:188.0


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