设计模式之---观察者模式
来源:互联网 发布:淘宝售假扣2分多久清零 编辑:程序博客网 时间:2024/06/05 12:06
观察者模式,或叫做观测者模式,说白了,就是对象间的一对多依赖,当一个对象的状态发生改变时,它的所有依赖者都会收到通知并自动更新。
那么我们可以定义以下三个接口:
主题接口,也就是被观察的主题对象:
package observer;public interface Subject {public void registerObserver(Observer o);public void removeObserver(Observer o);public void notifyObservers();}
观察者接口,当观察者发现主题对象状态改变时,要进行自身的更新:
package observer;public interface Observer {public void update(double value);}
显示接口,被观察的主题数据需要通过某种方式显示出来:
package observer;public interface Display {public void display();}
为方便起见,我们举例来讲解。假设现在我们要观察股市行情,那么对于股市来说,所有股民的电脑或者股市行情的布告板就是它的观察者,而股市本身就是一个被观察的主题对象。
那么我们可以很清楚的有下面几个类的定义:
股市行情类,也就是此时真正被观察的主题对象:
package observer;import java.util.ArrayList;public class StockQuotation implements Subject{private ArrayList<Observer> observers;private double stockvalue;public StockQuotation(){observers=new ArrayList<Observer>();}public void registerObserver(Observer o) {observers.add(o);}public void removeObserver(Observer o) {int i=observers.indexOf(o);if(i>=0){observers.remove(i);}}public void notifyObservers() {for(int i=0;i<observers.size();++i){Observer observer=(Observer) observers.get(i);observer.update(stockvalue);}}public void valueChanged(){notifyObservers();}public void setValue(double stockvalue){this.stockvalue=stockvalue;valueChanged();}}
布告板类,用于显示股市:
package observer;public class BillBoard implements Observer, Display{private double stockvalue;private Subject stockQuotation;public BillBoard(Subject stockQuotation){this.stockQuotation=stockQuotation;stockQuotation.registerObserver(this);}public void display() {System.out.println("Current stock quotation: "+stockvalue);}public void update(double stockvalue) {this.stockvalue=stockvalue;display();}public void deleteThisDisplay(){this.stockQuotation.removeObserver(this);}}
最后就是主类:
package observer;public class Main {public static void main(String[] args){StockQuotation stockQuotation = new StockQuotation();BillBoard billBoard = new BillBoard(stockQuotation);stockQuotation.setValue(2099.9);billBoard.deleteThisDisplay();stockQuotation.setValue(2090.9);}}
我们发现主类调用
billBoard.deleteThisDisplay();
之后布告板billBoard便不再是观察者,所有它接收不到任何的股市行情了。
这样的简单代码就实现了观察者模式。
我们可以发现,当新类型的观察者出现时,主题的代码不需要修改。主题不在乎别的,只会发送通知给所有实现了观察者接口的对象。
主题和观察者之间松耦合,正是观察者模式的独到之处。
0 0
- 设计模式之-观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- 使用 getValueStack() 使数据在JSP页面中回显
- Task和Back Stack(二)
- Accelerated C++:通过示例进行编程实践——练习解答(第5章)
- boost 遍历文件或目录
- FineUIt配置
- 设计模式之---观察者模式
- Codeforces 110A-Nearly Lucky Number(实现)
- J2SE习题(2)
- 写在前面的话
- JQuery实战--可以编辑的表格
- C++ operator关键字(重载操作符)
- 进程与线程的区别联系
- python与其他语言进行比较
- Android Activity生命周期及状态区别