观察者模式

  观察者模式的定义是: 定义对象中的一种 一对多的关系依赖关系,   以便当一个对象的状态改变的时候,所有依赖他的对象都能得到通知并且刷新

  观察者模式是一种非常常见的设计模式,应该范围非常广, 就本人做游戏来说 ,用到的位置非常多

  举一个游戏中的例子,玩家的血量这一个属性, 当玩家血量减少时候,玩家的头像处血量需要得到通知并且刷新血量, 假如人物掉血需要出现数字掉血的效果,那么 此对象也需要知道人物掉血的状态,人物血量下降到一定的百分比,触发某种特殊效果,此时此对象也需要得到人物血量减少的通知;

  

  观察者模式是一种发布订阅模式,  就是 观察者对象 同时向被观察者对象订阅了某种服务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的值可能被其他现成更改)

关于 多线程环境的学习  打算 单独进行

 

此致  敬礼

 

选择 程序  就是选择了 不断学习 不断进步  加油 = = 

posted @ 2014-05-24 23:07  ruoyu4game  阅读(886)  评论(0编辑  收藏  举报