Observer.java
package com.jeff.observer; public abstract class Observer { public void register(Observer obs){ obs.register(this); } public void unregister(Observer obs){ obs.unregister(this); } public void inform(String msg){}; } package com.jeff.observer; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class WeatherData implements Subject { private List<Observer> users=new ArrayList<Observer>(); public void inform_all(String message) { for (Iterator user = users.iterator(); user.hasNext();) { Observer obs = (Observer) user.next(); obs.inform(message); } } public void register(Observer obs) { users.add(obs); } public void unregister(Observer obs) { users.remove(obs); } }UserA.java
package com.jeff.observer; public class UserA extends Observer { @Override public void inform(String msg) { System.out.println("UserA have got weather message: "+msg); } }UserB.java
package com.jeff.observer; public class UserB extends Observer { @Override public void inform(String msg) { System.out.println("UserB have got weather message: "+msg); } }
Demo.java
package com.jeff.observer; public class Demo { public static void main(String[] args) { Subject weatherData= new WeatherData(); UserA usera=new UserA(); UserB userb=new UserB(); weatherData.register(usera); weatherData.register(userb); weatherData.inform_all("date 2009/08/24;weather:cloudy;temperature:33"); weatherData.inform_all("date 2009/08/25;weather:sunny;temperature:34"); weatherData.unregister(usera); weatherData.inform_all("date 2009/08/26;weather:rain;temperature:26"); } }运行结果:
UserA have got weather message: date 2009/08/24;weather:cloudy;temperature:33 UserB have got weather message: date 2009/08/24;weather:cloudy;temperature:33 UserA have got weather message: date 2009/08/25;weather:sunny;temperature:34 UserB have got weather message: date 2009/08/25;weather:sunny;temperature:34 UserB have got weather message: date 2009/08/26;weather:rain;temperature:26
在这个简单的 Observer 设计模式的实现中,我们主要分析 demo.java 这个文件。在 demo 类的应用中,我们不难看出,我们在实例化对象 weatherData , userA , userB 的时候,类型选用的是接口类和抽象类。为什么不用实体类来定义呢?这就是多态的意义所在。其实,如果用实体类来定义这些实例化对象,结果是完全一样的。这个差别从 userA 和 userB 的定义可以找到答案。对于 demo 类的应用者来说,我们只需要关心 Observer 类的抽象定义就知道如何调用 userA 和 userB 的功能,而不用去关心 UserA 和 UserB 这两个类的具体实现,也许还有 UserC , UserD 等等很多种不同形态的类。对于程序设计而言,如果我们要一一关注这些具体类的实现,那么无疑增加了开发者的工作量。还有一点,当 UserA 、 UserB ……等子类的实现发生改变的时候,其他部分的代码都可以不用改变。譬如 UserA 改变 inform 函数的实现:
@Override
public void inform(String msg){
System. out .println( “This is new york city.” );
System. out .println( “UserA have got weather message: “ + msg);
}
也许采用 Observer 这个模式来解释多态的优异特性不是很适合。下次我再用一个更能说明多态的优点的设计来谈一下(不套用设计模式了,呵呵)。在这里专门用到 Observer 这个模式,算是对设计模式的一个引子,抛砖引玉,希望大家以后能多多的探讨这个方面的问题。