灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:2858回复:0

java设计模式之二:观察者模式

楼主#
更多 发布于:2012-09-08 09:42

我想玩过魔兽世界的人,在分装备的时候,往往团长手黑就不说了,Roll点也各种悲剧啊....


这里以roll点为例子,一个团队里的人,分东西的时候,采取Roll点的方法,谁Roll的点高,谁就可以拿装备。只有团队里的人才能够看到团队里的人ROLL的点数,不在团队里的人就看不到,这是如何实现的呢?就需要用到观察着模式了。比如说,有个门卫把守住一个旅馆,每一个进入旅馆的人,这个门卫就把他列入名单,当旅馆里的人丢骰子的时候,这个门卫就会把所有名单上的人都通知一下“XXXROLL出了多少点”。同理,只要是进入了团队的人,就可以被通知到某某人ROLL出了多少点。







[java]  package watcher;

import java.util.ArrayList;
import java.util.List;

public class Dice {

    // 存放所有队员的list  
    public List<BaseTeamer> list = new ArrayList<BaseTeamer>();

    // 对于每一个队员,都要发送通知  
    public void notices(String msg) {
        for (int i = 0; i < list.size(); i++) {
            BaseTeamer baseTeamer = list.get(i);
            baseTeamer.pushMsg(msg);
        }
    }
    // 加入一个队员  
    public void addListenter(BaseTeamer teamer) {
        list.add(teamer);
    }

    // 丢骰子  
    public void roll() {
        notices("XXX ROLL 了100点");
    }
}
package watcher;


import java.util.ArrayList;
import java.util.List;


public class Dice {


    // 存放所有队员的list
    public List<BaseTeamer> list = new ArrayList<BaseTeamer>();


    // 对于每一个队员,都要发送通知
    public void notices(String msg) {
        for (int i = 0; i < list.size(); i++) {
            BaseTeamer baseTeamer = list.get(i);
            baseTeamer.pushMsg(msg);
        }
    }
    // 加入一个队员
    public void addListenter(BaseTeamer teamer) {
        list.add(teamer);
    }


    // 丢骰子 www.atcpu.com
    public void roll() {
        notices("XXX ROLL 了100点");
    }
}


[java] package watcher;

/**
* 所有团队成员父类,当然用接口也是可以的
*/
public class BaseTeamer {

    public void pushMsg(String msg) {
        System.out.println(msg);
    }

}
package watcher;


/**
* 所有团队成员父类,当然用接口也是可以的
*/
public class BaseTeamer {


    public void pushMsg(String msg) {
        System.out.println(msg);
    }


}


[java] package watcher;

public class Teamer extends BaseTeamer {

}
package watcher;


public class Teamer extends BaseTeamer {


}


测试类:[java] package test;

import watcher.Dice;
import watcher.Teamer;

public class WatcherTest {

    public static void main(String[] args) {
        // 创建一个骰子对象,然后给一个队员添加监听事件,然后ROll点,就会收到ROLL点信息  
        Dice dice = new Dice();
        Teamer teamer = new Teamer();
        dice.addListenter(teamer);
        dice.roll();
    }

}
package test;


import watcher.Dice;
import watcher.Teamer;


public class WatcherTest {


    public static void main(String[] args) {
        // 创建一个骰子对象,然后给一个队员添加监听事件,然后ROll点,就会收到ROLL点信息
        Dice dice = new Dice();
        Teamer teamer = new Teamer();
        dice.addListenter(teamer);
        dice.roll();
    }


}





测试结果:


XXX ROLL 了100点








总结:观察者模式,主要用于监听事件,当发生了某个动作之后,通知这些注册了监听的类




喜欢0 评分0
游客

返回顶部