哇,今天设计模式艺术看到了观察者模式,感叹这个jdk内置功能类的强大。之前知道这个功能很强大但是以我的看法一定实现起来很难,之后就没去研究了,今天看了之后才知道原来这个东东是jdk内置的。而且非常好用呢
记录一下:
首先要理清楚什么事观察者和被观察者,期初我比较迷惑这个称谓的规定,就像除数和被除数的关系,照理说A/B那b应该是被除啊,就像我打你,你是不是被打了???哈哈哈,其实这和正常思维不一样,其实A是被除的。
观察者和被观察者的关系和上面举的除数的例子刚好相反,被观察者对应于那个除数,观察者对应于被除数。
比如,我要观察你,那么我就是观察者,你就是被观察者,你做的一切举动我都能收到,并且我能对你的举动进行反馈。
那么具体代码的实现呢:
先定义一个观察者:
public class Coder implements Observer { private String name; public Coder(String name) { this.name = name; } private static final String TAG = "Coder"; @Override public void update(Observable o, Object arg) { Log.e(TAG, "update: "+name+" "+arg); } }只要实现obderver接口即可即可,并在update方法中编码接收到被观察者状态变化之后的操作。
然后定义被观察者:
public class Teacher extends Observable { public void invalidate(){ notifyObservers("你好"); } }只需要继承observable即可,里面可以定义方法,比如通知的方法,notifyObservers(object o);可以传递任意类型;还有deleteObservers(Observer o);删除观察者等等方法;
使用的时候,要先给被观察者添加观察者,可以有多个:
比如:
Teacher teacher = new Teacher(); Coder coder = new Coder("dingbin"); Coder coder2 = new Coder("dingbin2"); Coder coder3 = new Coder("dingbin3"); teacher.addObserver(coder); teacher.addObserver(coder2); teacher.addObserver(coder3);
最终会调用对应的coder的update方法,并将值传递过去。
哇,很吊的样子,以后写代码的时候又多了一种牛逼的选择。
当然主要是这种观察者-被观察者的方式能大大的实现解耦,灵活性更高,适用于那种需要对状态改变做出及时调整的功能需求。mark~~