观察者模式:
一个主题(被观察者)提供一个接口让别人注册,也就是关注你,之后你的可以一次通知所有关注你的对象。
类似于微信的公众号。
主题添加观察者是面向接口的,所以新增观察者不需要对主题做修改,这样两者之间不会相互影响
降低两者之间的耦合
主题和观察者之间的互联都是通过接口
针对接口编程
这对接口的编程的优点就是扩展性强,降低两者之间的关联
也是有缺点的:
因为在被观察者主题发出通知的时候,所有观察者都会收到通知,在收到通知后做出相应的操作,但是如果这时候观察者之间有循环依赖的话,程序很可能奔溃,
一般流程是这样
新建观察者接口
public interface Observer {
void update();
}
新建被观察者接口
public interface Subject {
void resgisterOb(Observer observer);
void unregisterOb(Observer observer);
void notifyAllOb();
}
两个实现接口的具体类
观察者
public class Observer1 implements Observer{
public static final String TAG=Observer1.class.getSimpleName();
private Subject subject;
//这里三个参数是用于demo中的效果的
private int index;
private TextView tvResult;
private TextView tvObserver;
private int oldCount;
public Observer1(Subject subject, TextView tvObserver, TextView tvResult, int index) {
this.subject = subject;
this.tvObserver=tvObserver;
this.tvResult=tvResult;
this.index=index;
}
public void registerSb(){
subject.resgisterOb(this);
if(TextUtils.isEmpty(tvObserver.getText().toString().trim())){
oldCount=1;
}else {
String old = tvObserver.getText().toString().trim();
oldCount = Integer.parseInt(old);
oldCount++;
}
tvObserver.setText(oldCount+"");
}
public void unregisterSb(){
subject.unregisterOb(this);
}
@Override
public void update() {
Log.e(TAG,index+" 收到更新");
tvResult.setText(tvResult.getText().toString().trim()+"\n"+index+" 收到通知");
}
}
被观察者类
public class SubJect1 implements Subject{
public List list_observer=new ArrayList();
@Override
public void resgisterOb(Observer observer) {
list_observer.add(observer);
}
@Override
public void unregisterOb(Observer observer) {
list_observer.remove(observer);
}
@Override
public void notifyAllOb() {
for(Observer observer : list_observer){
observer.update();
}
}
}
实际调用
部分代码
subJect1 =new SubJect1();
index=0;
/**
* 主题发出通知
*/
private void notifyAllOb() {
tvResult.setText("");
subJect1.notifyAllOb();
}
/**
* 添加一个观察者
*/
private void addObserver() {
index++;
Observer1 observer1=new Observer1(subJect1,tvObserver,tvResult,index);
observer1.registerSb();
}
实际效果
写博客坚持不容易,只是想记录自己今天学到了什么,说出想说的话,虽然很多人看不懂,说我语句不通。但是,没关系。