简单Android项目-微博客户端中观察者模式的运用
GitHub链接地址:https://github.com/xiaosong520/ObserverPatternDemo
一、观察者模式介绍
观察者模式定义了一种一对多的依赖关系,一个主题对象可被多个观察者对象同时监听。当这个主题对象状态变化时,会通知所有观察者对象并作出相应处理逻辑。
二、从源码中分析观察者模式
观察者模式定义了四种角色:抽象主题、具体主题、抽象观察者、具体观察者。
抽象主题(Subject):该角色是一个抽象类或接口,定义了增加、删除、通知观察者对象的方法。
具体主题(ConcreteSubject):该角色实现了抽象主题中的方法,当自身的状态发生改变时,可向其他观察者发送消息。
抽象观察者(Observer):该角色是具体观察者的抽象类,定义了一个更新方法。
具体观察者(ConcrereObserver):该角色是具体的观察者对象,实现了抽象观察者的方法。这些对象可以通过得到的通知后,更新自身的状态。
如图为此项目中的模型图:

此程序设计了一个被观察者小嵩的微博客服端,并且拥有几个粉丝(充当观察者)订阅。当粉丝订阅(登记)时,博主小嵩会知道这些粉丝(具体观察者)。当微博博主小嵩更新微博时,自动通知订阅者,即粉丝会收到相应的微博通知。
抽象主题(Subject)接口:
public interface Subject {
/**
* 增加观察者
* @param observer
*/
public void attach(Observer observer);
/**
* 删除观察者
* @param observer
*/
public void detach(Observer observer);
/**
* 通知观察者
*/
public void notify(String message, TextView v);
}
具体主题ConcreteSubject:(被观察者 小嵩)
public class XiaosongSubject implements Subject {
//用于保存订阅了小嵩的博客的用户
private List<Observer> mPersonList = new ArrayList<>();
@Override
public void attach(Observer observer) {
mPersonList.add(observer);
}
@Override
public void detach(Observer observer) {
mPersonList.remove(observer);
}
@Override
public void notify(String message, TextView tv) {
for (Observer observer : mPersonList) {
observer.update(message,tv);
}
}
}
抽象观察者(Observer):
public interface Observer {
public void update(String msg, TextView tv);
}
具体观察者(Person):
public class Person implements Observer {
// 用户名
private String name;
public Person(String name) {
this.name = name;
}
@Override
public void update(String msg, TextView tv) {
tv.setText(tv.getText()+name+":"+ msg +"\n");
}
}
三、好处
观察者模式在被观察者和观察者之间建立一个的只是抽象的耦合。小嵩(具体主题,被观察者)所知道的只是一个具体观察者列表(关注自己的粉丝),每一个具体观察者都符合一个抽象观察者的接口。被观察者并不需要认识任何一个具体观察者,它只知道它们都有一个共同的接口。并且观察者模式支持广播通讯,被观察者会向所有的登记过的观察者发出通知。
浙公网安备 33010602011771号