观察者模式(Observer)是解决、解耦的钥匙。最常用的地方是GUI系统、订阅—发布系统。
定义
观察者模式是一种行为类模式,它定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。
使用场景
(1)关联行为场景,需要注意的是,关联行为是可拆分的,而不是“组合”关系。
(2)事件多级触发场景。
(3)跨系统的消息交换场景,如消息队列、事件总线的处理机制。
角色介绍
Subject:抽象主体也是被观察的角色
ConcreteSubject:具体主体
Observer:抽象观察者
ConcretePbserver:具体观察者
Subject主要方法:
//添加观察者
@Override
public synchronized void addObserver(Observer o) {
super.addObserver(o);
}
//删除观察者
@Override
public synchronized void deleteObserver(Observer o) {
super.deleteObserver(o);
}
//表示状态或者内容发生改变
@Override
protected synchronized void setChanged() {
super.setChanged();
}
//通知所有观察者
@Override
public void notifyObservers(Object arg) {
super.notifyObservers(arg);
}
Observer主要方法
@Override
public void update(Observable o, Object arg) {
//更新的内容
}
使用案例
比如说我们要在一个网站订阅他的推送消息,在他每更新一次都会为他啊的订阅者推送一系列的文章等.我们就可以把他叫做—-订阅模式,也可以叫做观察者模式
Activity测试类
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//被观察的角色
Server_side server_side=new Server_side();
//观察者
Client client=new Client("小猪");
Client client1=new Client("小狗");
Client client2=new Client("小鸭子");
//将观察者注册到可观察的对象中
server_side.addObserver(client);
server_side.addObserver(client1);
server_side.addObserver(client2);
//发布消息
server_side.postNews("萨达姆做好了战斗准备");
}
具体主体
public class Server_side extends Observable {
public void postNews(String content){
//表示状态或者内容发生改变
setChanged();
//通知所有观察者
notifyObservers(content);
}
//添加观察者
@Override
public synchronized void addObserver(Observer o) {
super.addObserver(o);
}
//删除观察者
@Override
public synchronized void deleteObserver(Observer o) {
super.deleteObserver(o);
}
}
具体观察者
public class Client implements Observer {
String name;
public Client(String name) {
this.name = name;
}
@Override
public void update(Observable o, Object arg) {
Log.e("客户", name+",内容更新了"+"-内容-"+arg);
}
@Override
public String toString() {
return "客户:"+name;
}
}
Android源码中的观察者
ListView是重要的控件之一.他最重要的一个功能就是Adapter。通常我们在ListView调用之后都会调用notifyDataSetChanged()方法.因为他就是用了观察者模式..
在AdapterView
类中有个内部类AdapterDataSetObserver
,在ListView中设置Adapter时会构建一个AdapterDataSetObserver
并注册到Adapter中,这就是一个观察者
在Adatpter中包含了一个数据集可观察者DataSetObservable
,在数据发生变换时,我们可以手动调用Adapter.notifyDataSetChanged
. 接下来.notifyDataSetChanged
.会调用DataSetObservable
的notifyChanged
函数遍历所有的观察者onChanged
这就是大概的一个流程,详细的请参考ListViewAdapter的源码.
观察者模式优及缺点
优点
- 观察者和被观察者之间是抽象耦合,应对业务变化
- 增强系统灵活性、可扩展性
缺点
- 应用的时候需要考虑开发效率和运行效率的问题。