观察者模式数据库
为何使用观察者模式?函数
观察者模式应用实例设计
观察者模式:又被称为订阅者模式,经过一个对象管理相依于它的多对象,同时当该对象的状态改变的时候会主动通知依赖于它的对象。经常使用在咱们后台数据的变化对于前台view的更新上。code
优势:让主题和依赖主题的观察者之间松耦合,实现逻辑层和表示层的分离orm
继续上一个游戏的设计,对于每个游戏角色都会有一个蓝条表明其魔法,在释放技能的时候就会消耗,同时有一个红条表明血量,当被攻击的时候,红条就会减小,当英雄被玩家操控,进行打斗的时候,红条和蓝条就会随着打斗的进行,要求的不断的变化,这样给与用户更好的体验,用户能够根据实时的情况选择合适的操做,逃或者是继续打斗,同时对于英雄的其余一些信息,仍是须要在屏幕的其它地方进行显示,这个时候就须要咱们可以实时的获取这些信息,咱们可能首先会想到,采用轮询的机制,去主动获取数据库或者其它存储区域的数据。
可是咱们的开发中是不会使用这种方式的,首先轮询是相对比较消耗的,再就是对于每一个英雄都要单独写代码来获取信息,若是咱们要对其进行修改,这个时候,咱们须要将其打开,而后对其修改,势必增长了咱们犯错的机会,获取具体数据的代码和咱们要展现数据的代码都混在了一块儿,这个时候,咱们就须要使用观察者模式,来将咱们的View层和数据的获取分出来,使用观察者模式,咱们经过一个类用来做为数据管理类,而后定义一个接口各个view实现这个接口,经过接口来和数据管理类进行交互,同时能够实现,数据变化后更新,view层被动获取数据,而不须要主动去抓数据。下面经过代码演示一下。server
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源代码,和触发代码,此处再也不继续演示,主要是借助这个例子来帮助咱们进一步的理解观察者模式的实际价值和用途。接口
后一篇,将讲解单例模式。队列