观察者模式
观察者模式的定义是: 定义对象中的一种 一对多的关系依赖关系, 以便当一个对象的状态改变的时候,所有依赖他的对象都能得到通知并且刷新
观察者模式是一种非常常见的设计模式,应该范围非常广, 就本人做游戏来说 ,用到的位置非常多
举一个游戏中的例子,玩家的血量这一个属性, 当玩家血量减少时候,玩家的头像处血量需要得到通知并且刷新血量, 假如人物掉血需要出现数字掉血的效果,那么 此对象也需要知道人物掉血的状态,人物血量下降到一定的百分比,触发某种特殊效果,此时此对象也需要得到人物血量减少的通知;
观察者模式是一种发布订阅模式, 就是 观察者对象 同时向被观察者对象订阅了某种服务i, 当被观察者 状态发生改变的时候, 通知观察者 刷新状态;
代码如下:
package test.client; import java.util.ArrayList; import java.util.List; public class ObserverTest { //使用场景 public static void main(String[] args){ FlyHpObserver objOne = new FlyHpObserver(); HeadHpObserver objTwo = new HeadHpObserver(); HpStateObserver objThree = new HpStateObserver(); HpAttribute subject = new HpAttribute(); subject.addObserver(objOne); subject.addObserver(objTwo); subject.addObserver(objThree); subject.setW_HpValue(100); } } interface IObserver { public void update(int hp); } class FlyHpObserver implements IObserver{ @Override public void update(int hp) { System.out.println("fly hp bar and the current hp is " + hp); } } class HeadHpObserver implements IObserver{ @Override public void update(int hp) { System.out.println("head hp changed and the current hp is " + hp); } } class HpStateObserver implements IObserver{ @Override public void update(int hp) { System.out.println("hp changed and the current hp is " + hp); } } interface ISubject { public void addObserver(IObserver obj); public void removeObserver(IObserver obj); public void notifyAllObserver(); } class HpAttribute implements ISubject{ private int w_HpValue; private List<IObserver> w_ObserverList = new ArrayList<IObserver>(); public int getW_HpValue() { return w_HpValue; } public void setW_HpValue(int w_HpValue) { this.w_HpValue = w_HpValue; notifyAllObserver(); //当玩家血量改变的时候通知观察者刷新数据 } @Override public void addObserver(IObserver obj) { // TODO Auto-generated method stub w_ObserverList.add(obj); } @Override public void removeObserver(IObserver obj) { // TODO Auto-generated method stub w_ObserverList.remove(obj); } @Override public void notifyAllObserver() { int size = w_ObserverList.size(); for(int i = 0 ; i < size ; i++){ w_ObserverList.get(i).update(w_HpValue); } } }
输出结果如下:
fly hp bar and the current hp is 100
head hp changed and the current hp is 100
hp changed and the current hp is 100
由于观察者模式跟他的名字一样直观简单, 所以 也不打算多说了
我写的东西都没有考虑多线程环境的问题(比如 在 notifyAllObserver方法调用的时候 , w_ObserverList的值可能被其他现成更改)
关于 多线程环境的学习 打算 单独进行
此致 敬礼
选择 程序 就是选择了 不断学习 不断进步 加油 = =