zoukankan      html  css  js  c++  java
  • 观察者模式

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

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

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

      

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

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

    此致  敬礼

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

  • 相关阅读:
    线程同步 –Mutex和Semaphore
    线程同步 –AutoResetEvent和ManualResetEvent
    线程同步 – lock和Monitor
    .NET垃圾回收 – 非托管资源
    .NET垃圾回收 – 原理浅析
    反射简介—C#特性和反射
    反射简介—类型反射和晚期绑定
    Django REST framework 第一章 Serialization
    Django REST framework 简介
    Python Django 实用小案例2
  • 原文地址:https://www.cnblogs.com/wzforgame/p/3750586.html
Copyright © 2011-2022 走看看