Java設計模式之--觀察者模式(strategy)
概念:
觀察者模式是關於多個對象想知道一個對象中數據變化情況的一種成熟模式。觀察者模式中有一個稱作“主題”的對象和若干個稱作“觀察者”的對象,“主題”和“觀察者”之間是一種一對多的依賴關係。當“主題”的狀態發生變化時,所有“觀察者”都得到通知。
案例,某購物平臺,某品牌奶粉,被多個顧客添加關注(降低通知)當商品價格發生變化將受到通知
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