在日常中,我们配java环境变量时,设置一个JAVAHOME变量,这就是被观察者,使用了JAVAHOME变量的对象都是观察者,一旦JAVAHOME的路径改动,其他的也会跟着改动。
这样的例子很多,我想用小时候玩的老鹰捉小鸡游戏来简单的描绘观察者模式。
老鹰会变成观察者,母鸡和小鸡是观察者,一旦老鹰的动作发生变动,观察者们也会跟着发生变化
package 观察者模式; /** * 老鹰(被观察者) * * @Description * @author FuJianyong * 2015-7-6下午04:56:29 */ public class Eagle { /** * 动作 */ public static String action; private String name; public Eagle(String name){ this.name = name; } public void move(){ System.out.println(this.name + action); } }
package 观察者模式; /** * 母鸡(观察者) * @Description * @author FuJianyong * 2015-7-6下午04:57:50 */ public class Hen { private String name; public Hen(String name){ this.name = name; } public void move() { if(Eagle.action.equals("飞走了")){ System.out.println(this.name + "呱呱叫"); }else{ System.out.println(this.name + Eagle.action); } } }
package 观察者模式; /** * 小鸡 * @Description * @author FuJianyong * 2015-7-6下午05:00:25 */ public class Chick{ private String name; public Chick(String name) { this.name = name; } public void move(){ if(Eagle.action.equals("飞走了")){ System.out.println(this.name + "唧唧叫"); }else{ System.out.println(this.name + Eagle.action); } } }
测试代码:
package 观察者模式; import java.util.Random; /** * @Description 测试 * @author FuJianyong * 2015-7-6下午04:56:04 */ public class mainTest { private static final String[] actions = {"向左移动一步", "向左移动两步", "向左移动三步", "向右移动一步", "向右移动两步", "向右移动三步", "飞走了"}; public static void main(String[] args) { Eagle eagle = new Eagle("老鹰"); Hen hen = new Hen("母鸡"); Chick chick = new Chick("小鸡"); Random random = new Random(); int ran; for(int i=0;i<10;i++){ ran = random.nextInt(actions.length); Eagle.action = actions[ran]; eagle.move(); hen.move(); chick.move(); } } }
运行结果:
老鹰向左移动三步
母鸡向左移动三步
小鸡向左移动三步
老鹰向左移动一步
母鸡向左移动一步
小鸡向左移动一步
老鹰飞走了
母鸡呱呱叫
小鸡唧唧叫
老鹰向右移动三步
母鸡向右移动三步
小鸡向右移动三步
老鹰飞走了
母鸡呱呱叫
小鸡唧唧叫
老鹰飞走了
母鸡呱呱叫
小鸡唧唧叫
老鹰向左移动两步
母鸡向左移动两步
小鸡向左移动两步
老鹰向左移动三步
母鸡向左移动三步
小鸡向左移动三步
老鹰飞走了
母鸡呱呱叫
小鸡唧唧叫
老鹰向右移动一步
母鸡向右移动一步
小鸡向右移动一步