转载请声明出处:http://blog.csdn.net/qq_24692041/article/details/64438294
观察者模式在我们Android中被广泛的应用,比如说我们平时常用到的监听器,适配器的实现等等。今天我们来具体讲一下Observer模式的具体实现思想。首先,观察者模式的初步角色应该有观察者,被观察者两个角色。我们再来看看这两者的任务或者说职责都是啥!还有他们扮演的具体角色。
被观察者:1.自己会有数据变化的功能。2.当数据变化的时候,他要通知观察者,所以应该有通知观察者的功能,要通知观察者。3.它必须知道都有谁在观察他,所以它应该提供注册观察者的功能4.如果不想观察的时候还可以移除掉,所以需要提供删除观察者的功能。
观察者:只有一个职责就是接收被观察者的通知。
好了,现在我们开始来代码实现上面的理论。在设计模式的文章中我一直在强调一个东西,面向接口,面向抽象编程的思想。故而这儿我们应该是先根据上面的角色将抽象的角色写出来,然后在有具体的实现角色去继承抽象方法或者实现接口来完成我们的代码!
首先有一个被观察者NumberGenerator抽象类,提供注册观察者,删除观察者,提供观察者的方法。还需要提供两个个抽象方法getNumber,execute让观察者能拿到数据,并且需要提供一个执行的方法,表示注册等功能都做好了才去执行。具体的生成数据,返回数据,则不具体规定,只是规定行为,让子类实现方法自由发挥。
/** * Created by PICO-USER on 2017/3/21. */ public abstract class NumberGenerator { //用于存储对该类的所有观察者 private List observers = new LinkedList(); //注册观察者 public void registerObserver(Observer observer) { observers.add(observer); } //删除观察者 public void removeObserver(Observer observer) { observers.remove(observer); } //通知观察者更新数据 public void notifyObservers() { Iterator iterator = observers.iterator(); Observer observer = null; while (iterator.hasNext()) { observer = (Observer) iterator.next(); observer.update(this); } } public abstract int getNumber(); public abstract void execute(); }
还需要一个观察者角色Observer,需要一个更新数据的方法,该方法需要一个被观察者的对象,通过该对象获取新的数据。因为它的方法在这儿我们不需要具体实现,只需要规定某种行为,所以我们写成接口。
/** * Created by PICO-USER on 2017/3/21. */ public interface Observer { public abstract void update(NumberGenerator generator); }
好了,到这儿。我们Observer的思想其实就已经传达完毕了。剩下的就只是具体的实现,那就太简单了,可以个人自由发挥!下面我给出一个实例:
首先,具体的被观察者角色入场。RandomNumberGenerator类继承了NumberGenerator。实现了getNumber抽象方法和execute执行方法。用于返回具体的数据和生成具体数据。并且在数据发生改变之后调用父类的notifyObservers方法通知观察者。
/** * Created by PICO-USER on 2017/3/21. */ public class RandomNumberGenerator extends NumberGenerator { private Random random = new Random(); private int number; @Override public int getNumber() { return number; } @Override public void execute() { for (int i = 0; i < 20; i++) { number = random.nextInt(50); System.out.print("the new number has been created :" + number + "\n"); notifyObservers(); } } }
接下来是具体的观察者类的实现。很简单实现了Observer接口,具体实现update方法。拿到数据打印。
/** * Created by PICO-USER on 2017/3/21. */ public class DigitObserver implements Observer { @Override public void update(NumberGenerator generator) { System.out.print("number update :" + generator.getNumber() + "\n"); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } }好了,万事俱备。就差最后一脚了。来看看具体的调用Run类。很简单就是new了一个被观察者,和一个观察者,然后注册观察者。最后执行就行了。这儿注意new的是RandomNumberGenerator但是我是用他的父类NumberGenerator的引用去接的。包括Observer也是。注意这儿的差别,这就是一种设计模式的体现了,具体的被观察者和具体的观察者,根本不需要去知道一些跟自己无关的东西!这就是体现了设计模式的设计原则。具体是啥,需要网友自己慢慢去琢磨了。
public class Run { public static void main(String[] arg0) { NumberGenerator generator = new RandomNumberGenerator(); Observer observer = new DigitObserver(); generator.registerObserver(observer); generator.execute(); } }
到这儿,设计模式就讲完了。