观察者模式——顾名思义,就是一个对象观察另一个对象,当被观察的对象发生变化时,观察者也会跟着变化。
在日常中,我们配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();
}
}
}
运行结果:
老鹰向左移动三步
母鸡向左移动三步
小鸡向左移动三步
老鹰向左移动一步
母鸡向左移动一步
小鸡向左移动一步
老鹰飞走了
母鸡呱呱叫
小鸡唧唧叫
老鹰向右移动三步
母鸡向右移动三步
小鸡向右移动三步
老鹰飞走了
母鸡呱呱叫
小鸡唧唧叫
老鹰飞走了
母鸡呱呱叫
小鸡唧唧叫
老鹰向左移动两步
母鸡向左移动两步
小鸡向左移动两步
老鹰向左移动三步
母鸡向左移动三步
小鸡向左移动三步
老鹰飞走了
母鸡呱呱叫
小鸡唧唧叫
老鹰向右移动一步
母鸡向右移动一步
小鸡向右移动一步