之前从数据库中读取数据时总是要做类似于刷新一样的操作,感觉那是个很烦的工作,不仅影响写代码的效率也会影响程序的性能。还好最近了解到观察者模式有这样的功能,不知道我有没有理解错,如果有错,还望各位大神进行纠正,好吧!话就不多说,开始干正事
1、什么是观察者模式?
观察者模式(有时又被称为发布-订阅Subscribe>模式、模型-视图View>模式、源-收听者Listener>模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。
2、观察者的实现方式
观察者模式有很多种实现方式,从根本上说,观察必须包含两个角色 观察者 与 被观察者 对象。观察者和被观察者之间存在“观察”的逻辑关联,当被观察者发生改变时,观察者应付观察到这样的变化,并做出相应的响应。
注意:实现观察者模式的时候要注意,观察者与被观察者对象之间的互动关系不能体现成类之间的直接调用,否则就将使观察者和被观察者对象之间的紧密的耦合起来,从根本上违反面向对象的设计的原则。无论上观察者“观察”观察对象,还被观察者将自己的改变“通知”观察者,都不应该直接调用。
3、现在开始上代码吧
这里做个类似于广播的demo,有错的地方希望大家能指出来
定义一个观察者Watcher接口
public interface Watcher {
public void accept(String msg);//接收广播
}
定义一个被观察者Watched接口
public interface Watched {
public void addWatcher(Watcher watcher);
public void removeWatcher(Watcher watcher);
public void send(String msg);
}
用WatcherImpl.java实现Wacher接口
public class WatcherImpl implements Watcher{
public void accept(String msg) {
System.out.println("收到:"+msg);
}
}
用WatchedImpl.java实现Wached接口
package mycom;
import java.util.ArrayList;
import java.util.List;
public class WatchedImpl implements Watched{
private List<Watcher> list = new ArrayList<Watcher>();
public void addWatcher(Watcher watcher){
list.add(watcher);
}
public void removeWatcher(Watcher watcher){
list.remove(watcher);
}
public void send(String msg) {
for(Watcher watcher:list){
watcher.accept(msg);
}
}
}
最后一个测试类Test.java
public class Test {
public static void main(String[] args) {
Watcher w1 = new WatcherImpl();
Watcher w2 = new WatcherImpl();
Watcher w3 = new WatcherImpl();
Watched wd1 = new WatchedImpl();
wd1.addWatcher(w1);
wd1.addWatcher(w2);
wd1.addWatcher(w3);
wd1.send("广播");
}
}