作者:夏至,欢迎转载,但请保留这段申明,谢谢。
http://blog.csdn.net/u011418943/article/details/78008102
1、什么是观察者模式
定义对象间的一种 一对多的依赖关系。当一个对象的状态发生改变时,所有依赖于她的对象都得到通知并被自动更新
其中,订阅者我们称为 Observer,多个观察者的对象额比称为 Subject。
结构说明:
- Subject :目标对象,通常具有如下功能:
- 一个目标可以被多个观察者观察
- 目标提供对观察者的注册和退订的维护
当目标的状态发生改变时,通知所有注册的,有效的观察者
2、于接口定义的区别
相信很多人看到这里就会想说,跟接口不是差不多吗?是的,接口是一对一,而观察者则是一对多的关系,所以这点没啥好纠结的。
3、实战
现在微信已成为我们生活中必不可少的一种交通工具了,而订阅号也是微信的一个比较不错的功能。那我们就来模拟一下:有三个人订阅了这个公众号,但推送了一次消息后,有个人觉得不适合了,就取消订阅了。
首先,是更新的 Observer 接口,用来提示消息更新:
public interface Observer {
//推送消息
void update(String msg);
}
接着是公众号这个类,包含订阅,取消订阅,和消息推送:
public class Subject {
private String msg; //要发送的消息
/**
* 用来存储观察者的注册信息
*/
private List<Observer> observers = new ArrayList<>();
/**
* 用来保存注册者的信息
* @param observer
*/
public void registerObserver(Observer observer){
observers.add(observer);
}
public void unRegisterObserver(Observer observer){
int index = observers.indexOf(observer);
if (index >= 0){
observers.remove(index);
}
}
/**
* 通知所有
*/
protected void notifyObservers(){
for (Observer observer : observers) {
observer.update(msg);
}
}
/**
* 等消息改变的时候,通知所有注册的观察者
* @param msg
*/
public void setMsg(String msg){
this.msg = msg;
notifyObservers();
}
}
然后就是订阅者了,如下:
public class Reader implements Observer {
private static final String TAG = "zsr";
private String name;
public Reader(String name) {
this.name = name;
}
@Override
public void update(String msg) {
Log.d(TAG, name+" 收到订阅的消息了: "+msg);
}
}
主函数我们就可以这样写了:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Subject subject = new Subject();
Reader reader1 = new Reader("rachel");
Reader reader2 = new Reader("Moon");
Reader reader3 = new Reader("penel");
//订阅
subject.registerObserver(reader1);
subject.registerObserver(reader2);
subject.registerObserver(reader3);
//推送消息
subject.setMsg("今天是2017-9-17");
subject.unRegisterObserver(reader2);
subject.setMsg("取消绑定了一个");
}
}
上面中,我们有三个人订阅了这个公众号,中途有一个人取消订阅了,打印如下:
作者:u011418943 发表于2017/9/17 7:45:09 原文链接
阅读:82 评论:0 查看评论