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(); } }
测试结果:
曹操:开始进攻!!! 孙权:监视到了曹操开始进攻. 孙权:我们正面迎敌. 刘备:监视到了曹操开始进攻. 刘备:我们两翼包抄.
这个代码都很简单,我就不说什么了,可以自己意会。