文章出處
文章列表
使用頻率:★★★★★
一、什么是觀察者模式
一對多的關系,又叫發布-訂閱模式,即一個對象的狀態發生變化,所有依賴它的對象能夠知道該變化并自動更新;
二、補充說明
一對多:發布者是一,訂閱者是多;觀察目標是一,觀察者是多;狀態變化者是一,得到變化通知者是多;
三、角色
抽象主題
具體主題
抽象觀察者
具體觀察者
四、例子,JAVA實現
發布者為ConcreteSubject對象,PlusObserver和SubObserver為觀察者對象,接收到發布者的變化通知后分別做自增和自減操作,并打印結果;
抽象主題
package com.pichen.dp.behavioralpattern.observer; import java.util.ArrayList; import java.util.List; public abstract class Subject { private List<Observer> observers = new ArrayList<Observer>(); public void attach(Observer observer) { observers.add(observer); } public void detach(Observer observer){ observers.remove(observer); } public void notifyAllObservers(double value) { for (Observer observer : observers) { observer.update(value); } } public abstract void change(double value); }
具體主題
package com.pichen.dp.behavioralpattern.observer; public class ConcreteSubject extends Subject{ private double value; /** * @return the value */ public double getValue() { return value; } /** * 〈一句話功能簡述〉 * 〈功能詳細描述〉 * @see com.pichen.dp.behavioralpattern.observer.Subject#change() */ @Override public void change(double value) { this.value = value; System.out.println("original value:" + value); this.notifyAllObservers(value); } }
抽象觀察者
package com.pichen.dp.behavioralpattern.observer; public abstract class Observer { public abstract void update(double value); }
具體觀察者
package com.pichen.dp.behavioralpattern.observer; public class PlusObserver extends Observer { public PlusObserver(Subject subject) { subject.attach(this); } @Override public void update(double value) { System.out.println("After plus: "+ (++value)); } }
package com.pichen.dp.behavioralpattern.observer; public class SubObserver extends Observer { public SubObserver(Subject subject) { subject.attach(this); } @Override public void update(double value) { System.out.println("After sub: "+ (--value)); } }
調用示例
package com.pichen.dp.behavioralpattern.observer; public class Main { public static void main(String[] args) { Subject subject = new ConcreteSubject(); new SubObserver(subject); new PlusObserver(subject); subject.change(3.0); subject.change(10.2); } }
結果打印
original value:3.0 After sub: 2.0 After plus: 4.0 original value:10.2 After sub: 9.2 After plus: 11.2
文章列表
全站熱搜