观察者模式
定义:在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新。类似发布订阅模式,发布者发布信息,订阅者获取信息,订阅了就能收到信息,没订阅就收不到信息
四种角色:抽象被观察者角色 抽象观察者角色 具体被观察者角色 具体观察者角色
小Demo走一波
1、定义Observer
public interface Observer { public void notify(String info); }
2、定义Observer实现
public class ObserverImpl implements Observer{ private SubjectImpl subject; private String observerName; //注册感兴趣的subject public ObserverImpl(SubjectImpl subject, String observerName) { this.subject = subject; this.observerName = observerName; subject.register(this); } //打印接收到消息 @Override public void notify(String info) { System.out.println("observer " + this.observerName + " receive data: " + info); } }
3、定义Subject
public interface Subject { /** * register observer */ public void register(Observer obj); /** * remove observer */ public void remove(Observer obj); public void notifyIfObserverChange(); }
4、subject实现
public class SubjectImpl implements Subject{ private ArrayList<Observer> observerList = new ArrayList<Observer>(); private String info; @Override public void register(Observer obj) { observerList.add(obj); } @Override public void remove(Observer obj) { int i = observerList.indexOf(obj); if(i > 0) observerList.remove(i); } @Override public void notifyIfObserverChange() { for (int i = 0, len = observerList.size(); i < len; i++) { Observer instance = (Observer)observerList.get(i); instance.notify(info); } } public void setWork(String _info) { this.info = _info; System.out.println("send data: " + info); this.notifyIfObserverChange(); } }
5、测试
public class Main { public static void main(String[] args) { SubjectImpl sub = new SubjectImpl(); new ObserverImpl(sub, "t1"); new ObserverImpl(sub, "t2"); new ObserverImpl(sub, "t3"); sub.setWork("123"); } }