观察者模式(Observer):又叫 发布-订阅 (Publish/Subscribe)模式
观察者模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。
Subject类
package observer; import java.util.ArrayList; import java.util.List; /** * 抽象主题或抽象通知者 * @author 煞笔 * */ public abstract class Subject { private List<Observer> observers = new ArrayList<Observer>(); public void addAttach(Observer observer){ observers.add(observer); } public void removeAttach(Observer observer){ observers.remove(observer); } public void notice(){ for(Observer observer:observers){ observer.update(); } } }
ConcreteSubject类
package observer; /** * 具体主题或具体通知者 * @author 煞笔 * */ public class ConcreteSubject extends Subject { public String status; public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } }
observer类
package observer; /** * 抽象观察者 * @author 煞笔 * */ public interface Observer { public void update(); }
StockConcreteObserver类
package observer; /** * 具体观察者,股票观察者 * 具体观察者保存一个指向具体主题对象的引用 * @author 煞笔 * */ public class StockConcreteObserver implements Observer { private String name; private ConcreteSubject subject; private String status; public StockConcreteObserver(String name, ConcreteSubject subject) { super(); this.name = name; this.subject = subject; } @Override public void update() { this.status = subject.status; System.out.println("股票观察者"+name+"的通知信息是"+status); } public ConcreteSubject getSubject() { return subject; } public void setSubject(ConcreteSubject subject) { this.subject = subject; } }
YouKuConcreteObserver类
package observer; public class YouKuConcreteObserver implements Observer { private String name; private ConcreteSubject subject; private String status; public YouKuConcreteObserver(String name, ConcreteSubject subject) { super(); this.name = name; this.subject = subject; } @Override public void update() { this.status = subject.status; System.out.println("优酷观察者"+name+"的新状态是"+status); } public ConcreteSubject getSubject() { return subject; } public void setSubject(ConcreteSubject subject) { this.subject = subject; } }
Business类
package observer; public class Business { public static void main(String[] args) { ConcreteSubject subject = new ConcreteSubject(); subject.addAttach(new StockConcreteObserver("张三", subject)); subject.addAttach(new YouKuConcreteObserver("李四", subject)); subject.status="老板回来了"; subject.notice(); } }
观察者模式特点:
观察者模式的关键对象是主题Subject和观察者Observer,一个Subject可以有任意数目依赖它的Observer,一旦Subject的状态发生改变,所有的观察者Observer都可以得到通知。
当一个对象的改变需要同时改变其他对象的时候,而且它不知道具体有多少个对象等待改变,应该考虑使用观察者模式。
观察者模式所做的工作就是在解耦合。让耦合的双方都依赖于抽象,而不是依赖于具体。从而使得各自的变化都不会影响另一边的变化。
观察者模式的不足:
每一个观察者Observer都要实现Observer接口,但是有些控件都早已被它们的制造商给封装了。所以就不可能实现接口的。
抽象通知者还是依赖了抽象观察者,万一没有抽象观察者,功能都完成不了。
所有观察者对象都要有更新的动作
这个时候可以考虑时间委托实现