2015-11-13 (二)初探Observer和Observable的用法,了解Android 观察者模式的第一步

#面向自己写博客#

#面向初学者互相激励#


  大家好,上篇博文我讲了一个监控变量的思路,那么这篇博文,我们应该按照约定来讲:

观察者模型!

  啊,让一个初学者来说这个,真的不是难为人么?虽然我讲不通透,但是我可以分享着跟大家一起了解一下它的基本用法,至少可以解决我今天上午所说的那个问题。也就是五子棋的问题。这个问题我再摆出来:

  人物:我,一个学习JAVA总共46天的小菜鸟。

  事件:在编程做一款android五子棋游戏。

  需求:需要在人或机某一方获得胜利后,动态加载一个带按钮和文本的Fragment,并调整画布大小。

  背景:五子棋游戏中我在逻辑类Game中定义了一个静态的static int winner;并定义了一个方法,int winner();方便随时通过游戏的盘面,返回胜利者,当没有人胜利的时候返回0,当玩家胜利返回1,当AI胜利返回2;本文的问题在于,如果监听这个静态变量winner,使得一旦其变成了1或者2,马上跳出弹窗,并且停止游戏。

  那么我究竟应该怎么做才能做到这一点呢?

  首先:我想到的是类似OnClickListener的监听功能,查了一圈儿,问了一圈儿人,得到的答复是,木有类似的监听器,需要自己创建。这条路走不通,我却意外找到了另外两种实现方法,一种非常简单,一种稍微复杂一点

  简单的方法,请参见我的上一篇博文。

  本文讲的是所谓复杂一点的方法,也就是“观察者模式”,这个模式说大了,可以讲几天,我也没有完全弄懂,但是,我经过了一天的学习,已经简单了解了该方法的基本使用方法,正适合分享给摸不着头脑的朋友们。

  话不多说,咱上代码:

import java.util.Observable;
import java.util.Observer;

public class Beiguancha extends Observable{
	private static int n=0;
	
	public void setN(int n) {
		if(Beiguancha.n!=n){
		Beiguancha.n = n;
		this.setChanged();
		this.notifyObservers();}}
	}
  如上所示,我定义了一个类,Beiguancha,继承自Observable类,大家可以去看一下API文档,Observable继承自Object,就是观察者与被观察者中的被观察者的身份。

  在本例子中,我首先给Beiguancha定义了一个private成员变量n=0;并且给n做了一个setN方法,那么现在,setN就是改变n的唯一方法了,因此,只要有人改变n,就必须经由该方法。

  接下来,我就可以在该方法中做手脚了,首先,我先判断,setN输入的n和之前的n是否相等,相等就不用干啥,不相等就执行以下代码:

		Beiguancha.n = n;
		this.setChanged();
		this.notifyObservers();

  看看API,你会明白的,这下面的两个方法分别是:把自己标记成发生了变化和通知观察者们我发生了变化。

  接着,我们来定义观察者。

import java.util.Observable;
import java.util.Observer;

public class Guanchazhe implements Observer{
	@Override
	public void update(Observable o, Object arg) {
		System.out.println("111111");
	}
	
	public void gaibian(Beiguancha g1){
		g1.setN(1);
	}
	
	public static void main(String[] args){
		Guanchazhe g=new Guanchazhe();
		Beiguancha g1=new Beiguancha();
		g1.addObserver(g);
		g.gaibian(g1);
	}
	
}
  看到Guanchazhe这个类名,不用我翻译,你的拼音一定能够让你明白,它是观察者,那么这个接口Observer也就是观察者了!

  这里面的方法都太容易了,只有AddObserver需要注意一下,是对被观察者添加观察者。

最后的输出结果是“111111”。

  如果把g1.setN(1)改成g1.setN(0),那么,输出结果就为空了。因为n本来就=0啊,只有n改变的时候才输出呢。

  不知道我这个弱智的例子有没有帮到你呢?

  我还会继续深入学习的,有了新收获再和你分享吧





你可能感兴趣的:(2015-11-13 (二)初探Observer和Observable的用法,了解Android 观察者模式的第一步)