设计模式之观察者模式
1.什么是观察者模式(Observer)?
观察者模式在java中是一个非常重要的设计模式。就像它的名字一样,是用来观察事物的。被观察的对象被称为主题,观察主题的对象被称为观察者。
2.观察者模式用来解决哪些问题?
如果一个特定的对象的状态改变,随之对应的一组对象自动改变自己的状态。通过实现观察者模式来实现对象之间的耦合。
3.在java中怎么实现观察者模式?
在java中我们可以很容易的实现观察者模式。在java.util包中我们可以找到实现此模式的接口、类和方法。
Public Interface Observer
当主题改变时,任何实现此接口的对象将被通知。Update (Observable Ob, Object arg)方法被调用。
Class Observable:
观察者要观察的对象
一些重要的方法
addObserver(Observer o):为主题添加观察者
deleteObserver(Observer o):删除观察者
hasChanged():检查主题状态是不是改变
clearChanged():表示主题是否改变或者主题改变是否已经通知所有的观察者
notifyObservers(): 当主题改变时通知所有的观察者
你可以选择jdk提供的提供的类和接口或者自己写你的主题和观察者的接口,我更倾向于自己实现,应为这也不是很麻烦,而且比jdk提供的更为灵活
interface Observer{public void update(float intrest);}interface Subject{public void registerObserver(Observer observer);public void deleteObserver(Observer observer);public void notifyObervers();}import java.util.*;public class Loan implements Subject{private ArrayList<Observer> observers = new ArrayList<Observer>();private String type;private String bank;private float intrest;public Loan(String type,String bank,float intrest){this.type = type;this.bank = bank;this.intrest = intrest;}public float getIntrest(){return this.intrest;}public void setIntrest(float intrest){this.intrest = intrest;}public String getBank() {return this.bank; } public String getType() { return this.type; } public void registerObserver(Observer observer){ observers.add(observer); } public void deleteObserver(Observer observer){ observers.remove(observer); }public void notifyObervers(){for(Observer observer:observers){System.out.println("Notifying Observers on change in Loan interest");observer.update(this.intrest);}}}public class Newspaper implements Observer { public void update(float interest) { System.out.println("Newspaper: Interest Rate updated, new Rate is: " + interest); }}public class Internet implements Observer { public void update(float interest) { System.out.println("Internet: Interest Rate updated, new Rate is: " + interest); }}public class ObserverTest { public static void main(String args[]) { // this will maintain all loans information Newspaper printMedia = new Newspaper(); Internet onlineMedia = new Internet(); Loan personalLoan = new Loan("Personal Loan","Standard Charterd",12.5f); personalLoan.registerObserver(printMedia); personalLoan.registerObserver(onlineMedia); personalLoan.setIntrest(3.5f);personalLoan.notifyObervers(); }}