Android实际开发中遇到的应用场景:首界面 跳转到 消息列表 跳转到消息详情。当收到新的消息的时候,首页和消息列表要有小红点的提醒,使用观察者模式实现,降低代码的耦合度
被观察者
public class MessageObservable extends Observable {
private static MessageObservable instance;
private MessageObservable() {
}
public static MessageObservable getInstance() {
if (instance == null) {
instance = new MessageObservable();
}
return instance;
}
public void notifyDataChange() {
setChanged();
notifyObservers();
}
}
首页注册观察者
public class MainActivity extends Activity implements Observer {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MessageObservable.getInstance().addObserver(this);
}
@Override
public void update(Observable observable, Object data) {
//TODO 更新首页状态
}
}
消息列表注册观察者
public class MessageListActivity extends Activity implements Observer {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MessageObservable.getInstance().addObserver(this);
}
@Override
public void update(Observable observable, Object data) {
//TODO 数据源发生变化,更新界面状态
}
}
模拟消息服务中收到消息,通知界面更新
public class MessageServer extends Service{
@Override
public IBinder onBind(Intent intent) {
//模拟收到新的消息,通知相关界面更新
MessageObservable.getInstance().notifyDataChange();
return null;
}
}
附上Observable 部分代码,添加删除遍历的操作已由Observable 类实现
public class Observable {
List<Observer> observers = new ArrayList<Observer>();
boolean changed = false;
public Observable() {
}
public void addObserver(Observer observer) {
if (observer == null) {
throw new NullPointerException("observer == null");
}
synchronized (this) {
if (!observers.contains(observer))
observers.add(observer);
}
}
public synchronized void deleteObservers() {
observers.clear();
}
public void notifyObservers(Object data) {
int size = 0;
Observer[] arrays = null;
synchronized (this) {
if (hasChanged()) {
clearChanged();
size = observers.size();
arrays = new Observer[size];
observers.toArray(arrays);
}
}
if (arrays != null) {
for (Observer observer : arrays) {
observer.update(this, data);
}
}
}
}