观察者分为两种模式:推和拉
推模型是假定知道观察者需要什么数据,传这个数据过去;拉模型是不知道观察者需要什么数据,干脆把自身传给他,按需取值
应用场景如下:
订阅火车票之后,需要记录日志,也需要发送短信
如果常规写法,在订阅火车票内部实现,若以后还需要增加新功能则需要修改核心代码
推模式实现:
client.java 传的"ok"可以是任意字符串,也可以是subject的某一个字段,若为拉模式,只需要改为change(this)即可。
public static void main(String[] args) {
Subject subject=new Subject();
LogObservers observer=new LogObservers();
MessageObservers observers=new MessageObservers();
subject.addObservers(observer);
subject.addObservers(observers);
subject.change("ok");
}
subject.java
public class Subject {
private List<Object> list = new ArrayList<Object>();
public void addObservers(Object object) {
list.add(object);
}
public void removeObservers(Object object) {
list.remove(object);
}
public void change(String state) {
System.out.println("观察者改变了!");
for(Object object : list ) {
if(object instanceof LogObservers)
{
((LogObservers)object).doWork(state);
}else{
((MessageObservers)object).doWork(state);
}
}
}
}
接口
public interface ITicketObserver {
public void doWork(String state);
}
短信观察者
public class MessageObservers implements ITicketObserver {
@Override
public void doWork(String state) {
System.out.println("短信操作开始!更新状态"+state);
}
}
日志观察者
public class LogObservers implements ITicketObserver {
@Override
public void doWork(String state) {
System.out.println("日志文件操作开始!更新状态"+state);
}
}