通常我们的代码设计思想都是来源于生活,如面向对象的设计思想,观察者模式等均来源现实生活。在我们正常接触到的代码中,回调接口、回调函数、回调参数、监听器模式,这些也是观察者模式。
观察者模式(Observer)将观察者和被观察的对象分离开。拿观察者模式呢举个例子,我们界面是一个观察者,而界面上面显示的数据是被观察者,如果我们的数据一旦发生变化,我们的界面马上把这些变化后的数据显示出来。
面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并且将他做好。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。
观察者设计模式定义了对象间的一种一对多的组合关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。 —百度百科
在里面创建一个方法update(String str),当被观察者的数据发生变化后,回调此方法,所以,这个方法中需要完成当被观察者数据变化后的业务逻辑。
/**
* description:
* author: dujun
* created at: 2017/12/28 17:31
* update: 2017/12/28
* version:
*/
public interface Watcher {
void update(String str); // 当被观察者数据发生变化后,回调此方法
}
在里面创建三个抽象方法 ,其实现类将实现此三个抽象方法的业务逻辑
1.void addWatcher(Watcher watcher); 此方法是给次被观察者添加观察者
2.void removeWatcher(Watcher watcher);此方法是移除添加进来的观察者
3.void notifyWaters(String str);此方法是通知被添加进来的所有观察者数据发生了变化
/**
* description:
* author: dujun
* created at: 2017/12/29 9:21
* update: 2017/12/29
* version:
*/
public interface Watched {
// 添加观察者
void addWatcher(Watcher watcher);
// 移除观察者
void removeWatcher(Watcher watcher);
// 通知被添加进来的所有观察者数据发生了变化
void notifyWaters(String str);
}
在被观察者里面创建一个List集合,来存储被添加进来的观察者Watcher.
在notifyWaters()方法中,回调所有观察者update方法,来通知观察着数据发生了变花变化。
/**
* description:
* author: dujun
* created at: 2017/12/29 9:33
* update: 2017/12/29
* version:
*/
public class WatcheredImpl implements Watched {
private List list = new ArrayList<>();
@Override
public void addWatcher(Watcher watcher) {
list.add(watcher);
}
@Override
public void removeWatcher(Watcher watcher) {
list.remove(watcher);
}
@Override
public void notifyWaters(String str) {
for (Watcher watcher : list) {
watcher.update(str);
}
}
}
实现 update(String str)方法,在此方法中完成被观察者数据变化后的业务逻辑,
此处,我的逻辑很简单,就是当被观察者数据发生变化后,在控制台输出一个字符串。
/**
* description:
* author: dujun
* created at: 2017/12/29 9:38
* update: 2017/12/29
* version:
*/
public class WatcherImpl implements Watcher {
@Override
public void update(String str) {
// 在此完成被观察者数据变化后的业务逻辑
System.out.println(str);
}
}
编写测试类Test,测试类中,所有步骤的注释都写的很详细了,我这里就不再啰嗦。
/**
* description:
* author: dujun
* created at: 2017/12/29 9:41
* update: 2017/12/29
* version:
*/
public class Test {
public static void main(String [] args) throws Exception{
// 创建一个被观察者
WatcheredImpl watchered = new WatcheredImpl();
// 创建三个观察者的实例对象
WatcherImpl watcher1 = new WatcherImpl();
WatcherImpl watcher2 = new WatcherImpl();
WatcherImpl watcher3 = new WatcherImpl();
// 将三个观察者添加到被观察者中
watchered.addWatcher(watcher1);
watchered.addWatcher(watcher2);
watchered.addWatcher(watcher3);
// 被观察者数据发生变化,通知观察者
watchered.notifyWaters("被观察者数据发生了变化");
}
}
运行测试类Test,
三个观察着都接受到了观察者数据的变化,并作出了响应。
以上就是观察者模式的初步体验,更加详细的介绍,将在后面的文章中介绍。请看Rx_java系列二-使用java中的类(Observable与Observer)实现观察者模式