下面通过举个例子来了解下观察者模式的使用场景。
现在金融媒体每天都实时知道各家银行的利息利率,当然媒体小伙伴可以每天时不时的去询问,也就是轮询,这样干的话,银行朋友可不耐烦了,祢TMD别来烦我,我还有一大堆客户要处理呢。媒体朋友于是想了个办法,在银行找个兼职小伙伴,媒体朋友让他做的是,每当银行公布利率时,只需他打电话告知下我们媒体朋友,这样不就省事多了。
简单的说,观察者模式就是,观察者注册通知中心,通知中心接收到变化,会给相应的观察者发消息。 其中涉及到通知中心Subject、观察者Observer , 观察者必须注册到Subject
下面是具体实现代码
观察者接口
package cn.dev4mobile.android.observer.app;
/**
* Created by dev4mobile on 14-5-18.
*/
public interface Observer {
//Observer Operation
public void update(float interest);
}
package cn.dev4mobile.android.observer.app;
/**
* Created by dev4mobile on 14-5-18.
*/
public class Internet implements Observer{
@Override public void update(float interest) {
System.out.println("Internet[" + interest + "]");
}
}
Subject 接口
/**
* Created by dev4mobile on 14-5-18.
*/
public interface Subject {
public void registerObserver(Observer observer);
public void unregisterObserver(Observer observer);
public void notifyObservers();
}
package cn.dev4mobile.android.observer.app;
import java.util.ArrayList;
import java.util.List;
/**
* Created by dev4mobile on 14-5-18.
*/
public class Loan implements Subject{
private List<Observer> observers = new ArrayList<Observer>();
private float interestRate;
public float getInterestRate() {
return interestRate;
}
public void setInterestRate(float interestRate) {
this.interestRate = interestRate;
notifyObservers();
}
@Override public void registerObserver(Observer observer) {
observers.add(observer);
}
@Override public void unregisterObserver(Observer observer) {
observers.remove(observer);
}
@Override public void notifyObservers() {
for (Observer observer : observers) {
observer.update(interestRate);
}
}
}
业务逻辑处理
package cn.dev4mobile.android.observer.app;
import android.app.Activity;
import android.os.Bundle;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Loan loan = new Loan();
Internet internet = new Internet();
Paper paper = new Paper();
loan.registerObserver(internet);
loan.registerObserver(paper);
loan.setInterestRate(20.0f);
}
}
loan.setInterestRate() 这个方法实现里面必须有 notifyObservers(); 来通知观察者数据的变化
总之:通知中心含有观察者的引用,通知中心业务处理过程中,调用观察者来传递数据。