先介绍一下观察者模式,被观察者当然是要被观察者观察的,就比如C想知道B在干什么,但C又不想去监视B,于是就把B的监视工作交给了A,最终是A去监视B;(也就是A是观察者,B是被观察者),至于C,看看下面就知道了。
1)开始创建被观察者B,我这里用Observable代替了,java的util包里已经给我们提供了这个类,所以我们只要继承就好了。
public class Observable extends java.util.Observable { public void watchered1(){ Log.d("aaa","这是我被观察的方法一");2)创建被观察者A,这里我用MyObserver代替,需要实现Observer接口,重写update方法,里面的Observavle变量暂时不用,具体我没试过,不过应该就是那个被观察者对象。好了,我这里模拟A观察B,A再通知C,当update方法被调用的时候,其实就是B有动静,A观察到了,reportTOOther就相当于A通知C,//setChanged方法必须在notifyObservers之前调用,因为 //notifyObservers方法会用到里面boolean值,只有为true的时候notifyObservers才有效super.setChanged();//顾名思义,当我调用这个方法是去通知所有观察我的观察者
super.notifyObservers("被观察者方法一");} public void watchered2(){ Log.d("aaa","这是我被观察的方法二"); super.setChanged(); super.notifyObservers("被观察者方法二"); } }
public class MyObserver implements java.util.Observer { @Override public void update(Observable o, Object arg) { Log.d("aaa","我观察到了,开始向别人汇报"); reportTOOther(arg.toString()); Log.d("aaa","汇报完毕!"); } private void reportTOOther(String s) { Log.d("aaa","收到观察者的信息:"+s); } }3)观察者,被观察者都创建完了,那么开始new 出对象,为被观察者添加观察者。当然,被观察者要有动静观察者才能收到消息。因为我这里使用的是as,用eclipse,所以这里的MainActivity中的onCreate方法就相当于java里的main方法,一个程序的入口...当然也不能全说是,反正没必要深究。
public class MainActivity extends AppCompatActivity { //先创建一个观察者,如果有更多也一样 Observer myObserver = new MyObserver(); //定义出被观察者 Observable observable = new Observable(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //我可以根据我定的,有一个观察者在观察一个被观察者 observable.addObserver(myObserver); //被观察者要干嘛当然还是要去干嘛的,这样观察者才能收到消息 observable.watchered1(); observable.watchered2(); } }
4)这样一个简单的观察者模式就创建完成了,接着看看运行结果。