设计模式之观察者模式(解决、解耦的钥匙——观察者模式)
观察者模式介绍
观察者模式是使用概率非常高的模式,最常用的地方是GUI系统,订阅——发布系统。这个模式最重要的就是解耦,将被观察者和观察者解耦,使得它们之前的依赖性更小,甚至做到毫无差别。
观察者模式的定义
定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖它的对象都会得到通知并被自动更新。
观察者模式的使用场景
关联行为场景,需要注意的是,关联行为是可拆分的,而不是“组合”关系;
事件多级触发场景;
跨系统的消息交换场景如消息队列,事件总线的处理机制。
接下来就是观察者模式的简单实现了。
/**
* 读者为观察者
*
*/
public class Reader implements Observer {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void update(Observable o, Object arg) {
// TODO Auto-generated method stub
System.out.println(name + "有新的报纸过来了,请查阅
" + arg);
}
}
/**
* 被观察者 推送新闻
*
*/
public class NewsPapers extends Observable {
private String content;
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
//标识状态或者内容发生改变
this.setChanged();
//通知观察者,并发送新的内容
this.notifyObservers(content);
}
}
/**
* 测试类
*
*/
public class MainTest {
public static void main(String[] args) {
NewsPapers newsPapers = new NewsPapers();
Reader reader1 = new Reader();
reader1.setName("张三");
Reader reader2 = new Reader();
reader2.setName("张三2");
newsPapers.addObserver(reader1);
newsPapers.addObserver(reader2);
newsPapers.setContent(" 此节是观察者模式");
}
}
运行一下,输入打印为:
张三2有新的报纸过来了,请查阅 此节是观察者模式
张三有新的报纸过来了,请查阅 此节是观察者模式
这便是观察者模式的全部内容了。在android源码中我们也能看到观察者模式的例子,如ListView中有一个重要的功能是Adapter,添加数据,更新数据时,会调用AdapternotifyDataSetChanged()方法,其实这个就是当数据发生变化时通知所有的观察者,这就是我们的观察者模式,大家可以详情去看下源码。
观察者模式介绍
观察者模式是使用概率非常高的模式,最常用的地方是GUI系统,订阅——发布系统。这个模式最重要的就是解耦,将被观察者和观察者解耦,使得它们之前的依赖性更小,甚至做到毫无差别。
观察者模式的定义
定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖它的对象都会得到通知并被自动更新。
观察者模式的使用场景
关联行为场景,需要注意的是,关联行为是可拆分的,而不是“组合”关系;
事件多级触发场景;
跨系统的消息交换场景如消息队列,事件总线的处理机制。
接下来就是观察者模式的简单实现了。
/**
* 读者为观察者
*
*/
public class Reader implements Observer {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void update(Observable o, Object arg) {
// TODO Auto-generated method stub
System.out.println(name + "有新的报纸过来了,请查阅
" + arg);
}
}
/**
* 被观察者 推送新闻
*
*/
public class NewsPapers extends Observable {
private String content;
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
//标识状态或者内容发生改变
this.setChanged();
//通知观察者,并发送新的内容
this.notifyObservers(content);
}
}
/**
* 测试类
*
*/
public class MainTest {
public static void main(String[] args) {
NewsPapers newsPapers = new NewsPapers();
Reader reader1 = new Reader();
reader1.setName("张三");
Reader reader2 = new Reader();
reader2.setName("张三2");
newsPapers.addObserver(reader1);
newsPapers.addObserver(reader2);
newsPapers.setContent(" 此节是观察者模式");
}
}
运行一下,输入打印为:
张三2有新的报纸过来了,请查阅 此节是观察者模式
张三有新的报纸过来了,请查阅 此节是观察者模式
这便是观察者模式的全部内容了。在android源码中我们也能看到观察者模式的例子,如ListView中有一个重要的功能是Adapter,添加数据,更新数据时,会调用AdapternotifyDataSetChanged()方法,其实这个就是当数据发生变化时通知所有的观察者,这就是我们的观察者模式,大家可以详情去看下源码。