观察者模式也称为订阅发布模式,比较好理解,就是订阅发布这几个步骤,发布的时候可以选择删除增加和通知订阅人。看代码
抽象主题,包含增加删除通知功能抽象接口
package watcher;
/**
* 抽象主题,接口包含增加删除通知观察者功能,类似订阅内容。
* @author mercy
*
*/
public interface Watched {
//增加订阅者
public void addWatcher(Watcher watcher);
//删除订阅者
public void deleteWatcher(Watcher watcher);
//通知订阅者内容
public void notifyWatchers(String str);
}
具体主题,接口的具体的实现
package watcher;
import java.util.ArrayList;
import java.util.List;
/**
* 具体主题,发布通知,抽象主题的具体实现
* @author mercy
*
*/
public class ConcreteWatched implements Watched{
List<Watcher> list=new ArrayList<Watcher>();
@Override
public void addWatcher(Watcher watcher) {
list.add(watcher);
}
@Override
public void deleteWatcher(Watcher watcher) {
list.remove(watcher);
}
/*
* 逐个通知,具体观察者更新内容
*/
@Override
public void notifyWatchers(String str) {
for(Watcher watcher:list){
watcher.update(str);
}
}
}
抽象观察者对象,为所有具体的观察者定义一个接口,在得到主题的通知时更新自己。
package watcher;
/**
* 抽象观察者,负责更新内容接口。
* @author mercy
*
*/
public interface Watcher {
public void update(String str);
}
具体观察对象,实现抽象观察者的接口。
package watcher;
/**
* 具体观察者,负责具体的更新内容具体实现
* @author mercy
*
*/
public class ConcreteWatcher implements Watcher{
@Override
public void update(String str) {
System.out.println("更新中...订阅内容为:"+str);
}
}
测试
package watcher;
public class Test {
public static void main(String[] args) {
//新建一个主题实例
Watched watched=new ConcreteWatched();
//新建一个观察者实例
Watcher watcher1=new ConcreteWatcher();
//添加观察者
watched.addWatcher(watcher1);
//通知
watched.notifyWatchers("今天是冬至,快来吃饺子吧!");
}
}
结果
更新中...订阅内容为:今天是冬至,快来吃饺子吧!
所以,只需要发布者一通知,订阅者就可以更新所订阅的内容。