首页 > 代码库 > 设计模式之---观察者模式
设计模式之---观察者模式
观察者模式,或叫做观测者模式,说白了,就是对象间的一对多依赖,当一个对象的状态发生改变时,它的所有依赖者都会收到通知并自动更新。
那么我们可以定义以下三个接口:
主题接口,也就是被观察的主题对象:
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=http://www.mamicode.com/stockvalue;>布告板类,用于显示股市:
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=http://www.mamicode.com/stockvalue;>
最后就是主类:
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便不再是观察者,所有它接收不到任何的股市行情了。
这样的简单代码就实现了观察者模式。
我们可以发现,当新类型的观察者出现时,主题的代码不需要修改。主题不在乎别的,只会发送通知给所有实现了观察者接口的对象。
主题和观察者之间松耦合,正是观察者模式的独到之处。
设计模式之---观察者模式
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。