观察者分为两种模式:推和拉
推模型是假定知道观察者需要什么数据,传这个数据过去;拉模型是不知道观察者需要什么数据,干脆把自身传给他,按需取值
应用场景如下:
订阅火车票之后,需要记录日志,也需要发送短信
如果常规写法,在订阅火车票内部实现,若以后还需要增加新功能则需要修改核心代码
推模式实现:
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.javapublic 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); }}
新闻热点
疑难解答