观察者模式
为什么使用观察者模式?
观察者模式应用实例
观察者模式
观察者模式:又被称为订阅者模式,通过一个对象管理相依于它的多对象,同时当该对象的状态改变的时候会主动通知依赖于它的对象。常用在我们后台数据的变化对于前台view的更新上。
优点:让主题和依赖主题的观察者之间松耦合,实现逻辑层和表示层的分离
为什么使用观察者模式?
继续上一个游戏的设计,对于每一个游戏角色都会有一个蓝条代表其魔法,在释放技能的时候就会消耗,同时有一个红条代表血量,当被攻击的时候,红条就会减少,当英雄被玩家操控,进行打斗的时候,红条和蓝条就会随着打斗的进行,要求的不断的变化,这样给与用户更好的体验,用户可以根据实时的状况选择合适的操作,逃或者是继续打斗,同时对于英雄的其他一些信息,还是需要在屏幕的其它地方进行显示,这个时候就需要我们能够实时的获取这些信息,我们可能首先会想到,采用轮询的机制,去主动获取数据库或者其它存储区域的数据。
但是我们的开发中是不会使用这种方式的,首先轮询是相对比较消耗的,再就是对于每个英雄都要单独写代码来获取信息,如果我们要对其进行修改,这个时候,我们需要将其打开,然后对其修改,势必增加了我们犯错的机会,获取具体数据的代码和我们要展示数据的代码都混在了一起,这个时候,我们就需要使用观察者模式,来将我们的View层和数据的获取分出来,使用观察者模式,我们通过一个类用来作为数据管理类,然后定义一个接口各个view实现这个接口,通过接口来和数据管理类进行交互,同时可以实现,数据变化后更新,view层被动获取数据,而不需要主动去抓数据。下面通过代码演示一下。
public interface Data{
//注册数据监听者
public void registerObserver(Observer o);
//移除数据监听者
public void removeObserver(Observer o);
//数据更新后通知监听者
public void notifyObservers();
//更新数据
public void dataChanged();
}
//监听者类
public interface Observer{
//更新监听者的数据
public void updata(int blood,int energy);
//展示数据
public void display();
}
上面的代码大致为观察者模式的结构,对于后台的数据,我们设置一个变化管理类,如果需要访问我的数据,那么就需要通过接口的形式,通过调用注册函数,将依赖实例注入到数据对象,然后,当我们的数据类的对象变化后,我们调用通知方法,然后通知方法中函数所以依赖对象的队列,这样当我们的数据变化之后,各个组件就可以被动的获得最新的更新数据。
观察者应用实例
观察者应用实例,View中观察者模式使用的比较多,对于我们所能够看到的控件和对于控件的监听事件,我们通常使用的就是这种观察者模式,当我们为控件设置一个监听者,当我们的控件被触发之后,监听者就会被主动触发,来执行相应的操作。例如Button。
public class MyActivity extends Activity {
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.content_layout_id);
final Button button = (Button) findViewById(R.id.button_id);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// Perform action on click
}
});
}
}
此处的button可以看做是我们的主题,此处监听者通过匿名内部类的形式,通过setOnClickListenter的形式注入进去,这个时候,当button有点击事件,监听者就会被通知,就会主动调用监听者的ocClick方法,由于Button继承自TextView,TextView又继承自View,View中具有监听者队列,当有事件被触发,队列中的监听者就会被动触发。
具体的View源代码,和触发代码,此处不再继续演示,主要是借助这个例子来帮助我们进一步的理解观察者模式的实际价值和用途。
后一篇,将讲解单例模式。