#面向自己写博客#
#面向初学者互相激励#
大家好,上篇博文我讲了一个监控变量的思路,那么这篇博文,我们应该按照约定来讲:
观察者模型!
啊,让一个初学者来说这个,真的不是难为人么?虽然我讲不通透,但是我可以分享着跟大家一起了解一下它的基本用法,至少可以解决我今天上午所说的那个问题。也就是五子棋的问题。这个问题我再摆出来:
人物:我,一个学习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改变的时候才输出呢。
不知道我这个弱智的例子有没有帮到你呢?
我还会继续深入学习的,有了新收获再和你分享吧