定义:定义对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。
类型:行为类模式
观察者模式代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| public interface IObserver { void update(); } public class Observer1 implements IObserver{ @Override public void update() { System.out.println("Observer1 has updated"); } } public class Observer2 implements IObserver { @Override public void update() { System.out.println("Observer2 has updated"); } } abstract class Target { private ArrayList<IObserver> obs = new ArrayList<>(); public void addObserver(IObserver iObserver) { this.obs.add(iObserver); } public void delObserver(IObserver iObserver) { this.obs.remove(iObserver); }
public void notifyObserver() { for (IObserver o : obs) { o.update(); } } public abstract void doSomething(); } public class ConcreteTarget extends Target { @Override public void doSomething() { System.out.println("Concrete is doing something"); this.notifyObserver(); } } public class Main { public static void main(String args[]) { Target target = new ConcreteTarget(); target.addObserver(new Observer1()); target.addObserver(new Observer2()); target.doSomething(); } }
|
类图
通过运行结果可以看到,我们只调用了Target的方法,但同时两个观察者的相关方法都被同时调用了。仔细看一下代码,其实很简单,无非就是在Target类中关联一下Observer类,并且在doSomething方法中遍历一下Observer的update方法就行了。
观察者模式的优点
观察者与被观察者之间是属于轻度的关联关系,并且是抽象耦合的,这样,对于两者来说都比较容易进行扩展。
观察者模式是一种常用的触发机制,它形成一条触发链,依次对各个观察者的方法进行处理。但同时,这也算是观察者模式一个缺点,由于是链式触发,当观察者比较多的时候,性能问题是比较令人担忧的。并且,在链式结构中,比较容易出现循环引用的错误,造成系统假死。