java设计形式之观察者模式(3)

java设计模式之观察者模式(3)

 java设计模式之观察者模式(1)和 java设计模式之观察者模式(2)

都简单的介绍了观察者模式。

但是有局限,观察者是固定的,观者的行为也是固定的,解决观察者固定这个问题我们可以用容器,解决固定行为的问题,我们可以用aop解决,这里不多说了

现在讲下java 种已经提供了java.util.Observable类(被观察者)和java.util.Observer接口(观察者)。

比如三国时期,刘备和孙权联合抗击曹操。

假设曹操带领大军来攻击孙权,

孙权和刘备都要观察曹操的动静,因为他们是盟军嘛。

曹操:

package spring3.event;

import java.util.Observable;

public class CaoCao extends Observable {

	public void attact() {
		System.out.println("曹操:开始进攻!!!");
		super.setChanged();
		super.notifyObservers();
	}
}

 刘备:

package spring3.event;

import java.util.Observable;
import java.util.Observer;

public class LiuBei implements Observer {

	@Override
	public void update(Observable o, Object arg) {
		System.out.println("刘备:监视到了曹操开始进攻.");
		System.out.println("刘备:我们两翼包抄.");
	}

}

 孙权:

package spring3.event;

import java.util.Observable;
import java.util.Observer;

public class SunQuan implements Observer {

	@Override
	public void update(Observable o, Object arg) {
		System.out.println("孙权:监视到了曹操开始进攻.");
		System.out.println("孙权:我们正面迎敌.");
	}

}

 测试

package spring3.event;

public class Test {

	public static void main(String[] args) {
		LiuBei liu = new LiuBei();
		SunQuan sun = new SunQuan();

		CaoCao cao = new CaoCao();
		// 当然这是秘密安插间谍,谁也不能白痴到自己招间谍
		cao.addObserver(liu);
		cao.addObserver(sun);

		cao.attact();
	}
}

 测试结果:

曹操:开始进攻!!!
孙权:监视到了曹操开始进攻.
孙权:我们正面迎敌.
刘备:监视到了曹操开始进攻.
刘备:我们两翼包抄.

 这个代码都很简单,我就不说什么了,可以自己意会。