1.是什么
观察者定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个对象主题,当这个对象发送变化(执行什么方法了),会通知所有的观察者,观察者会做出对应的action。
此模式也叫发布-订阅模式,监听者就是订阅者,被监听者是发布者,也就是主题。
2.怎么用
比较简单,直接看示例代码。
/*
主题接口
*/
import java.util.ArrayList;
import java.util.List;
public abstract class Subject {
private List<IObserver> listeners = new ArrayList<>();
public void addListener(IObserver listener) {
listeners.add(listener);
}
public void removeListener(IObserver listener) {
listeners.remove(listener);
}
public void clearListener() {
listeners.clear();
}
void notifyListener() {
for (IObserver o : listeners) {
o.action();
}
}
/**
* @return the listeners
*/
public List<IObserver> getListeners() {
return listeners;
}
public abstract void startWork();
}
/**
* 主题实现类
*
*/
public class TVSubject extends Subject {
@Override
public void startWork() {
notifyListener();
System.out.println("开始看电视");
}
}
// 观察者接口
public interface IObserver {
public void action();
}
// 观察者实现
public class WatchTVObeserver implements IObserver {
@Override
public void action() {
System.out.println("告诉家长他又在看电视");
}
}
// client
/**
* 观察者模式</br>
* 观察到一看电视就通知家长</br>
* 作用类似于局部的拦截器</br>
* 拦截某个具体方法 </br>
* 只是拦截器可能是使用动态代理等实现,属于动态拦截</br>
*
* @author shaoyuxia
*
*/
public class Client {
public static void main(String[] args) {
IObserver ad = new WatchTVObeserver();
TVSubject sub = new TVSubject();
sub.addListener(ad);
sub.addListener(new IObserver() {
@Override
public void action() {
System.out.println("开始跳出弹窗");
}
});
sub.startWork();
}
}
网友评论