这里介绍的只是这种模式中最简单的部分。这里的特点就是“统一通知,各自处理”。先看下项目结构:
1、一共就这几个类。我先是写了“目标对象(被观察者)”这个类,然后被观察者需要知道有哪些“观察者”,相应的,需要提供接口(方法)给外界添加、删除“观察者”:
WeatherSubject.class
1 import java.util.ArrayList; 2 import java.util.List; 3 4 /* 5 * 目标对象,它知道观察它的观察者,并提供注册(添加)和删除观察者的接口 6 * @author 火龙裸先生 7 * */ 8 public class WeatherSubject { 9 10 //用来保存注册的观察者对象 11 private List<IObserver> observers = new ArrayList<IObserver>(); 12 13 // attach detach notifyObservers 14 //把订阅天气的人添加到订阅者列表中 15 public void attach(IObserver observer){ 16 observers.add(observer); 17 } 18 19 20 /** 21 * 删除集合中的指定观察者(订阅天气的人) 22 * @author 火龙裸先生 23 * */ 24 public void detach(IObserver observer){ 25 observers.remove(observer); 26 } 27 28 /** 29 * 通知所有注册的观察者对象(所有订阅天气的人) 30 * @author 火龙裸先生 31 * */ 32 protected void notifyObservers(){ 33 for(IObserver observer : observers){ 34 observer.updata(this); 35 } 36 } 37 38 }
2、虽然有了上面这个目标对象(被观察者),但是还要有一个再具体的目标对象(被观察者):
ConcreteWeatherSubject.class
1 /** 2 * 具体的目标对象,负责把有关状态存入到相应的观察者对象中 3 * 4 * */ 5 public class ConcreteWeatherSubject extends WeatherSubject { 6 7 //获取天气的内容信息 8 private String weatherContent; 9 10 public String getWeatherContent() { 11 return weatherContent; 12 } 13 14 public void setWeatherContent(String weatherContent) { 15 this.weatherContent = weatherContent; 16 //内容有了,说明天气更新了,通知所有订阅天气的人 17 this.notifyObservers(); 18 } 19 }
3、上面的目标对象(被观察者)中的"notifyObservers()"方法中,调用了一个updata(this)方法,传递的参数是它当前类的对象:
IObserver.class
1 /** 2 * 这是一个观察者接口,定义一个更新的接口给那些在目标发生改变的时候被通知的对象 3 * @author火龙裸先生 4 * */ 5 public interface IObserver { 6 7 /** 8 * 更新数据的接口 9 * subject 传入目标对象,方便获取相应的目标对象的状态 10 * @author 火龙裸先生 11 * */ 12 void updata(WeatherSubject weatherSubject); 13 14 }
4、OK,现在终于要开始写我们的“观察者”了,这里通过实现上面的观察者接口,来实现具体的更新操作:
ConcreteObserver.class
1 /** 2 * 具体的观察者对象,实现更新的方法,使自身的状态和目标的状态保持一致 3 * @author 火龙裸先生 4 * */ 5 public class ConcreteObserver implements IObserver{ 6 //观察者的名字,是谁收到了这个讯息,你的女朋友还是他老妈 7 private String observerName; 8 9 //天气内容的情况,这个消息从目标处获取 10 private String weatherContent; 11 12 //提醒的内容,你的女朋友提醒约会。而她老妈提醒购物 13 private String remindThing; 14 15 16 public String getObserverName() { 17 return observerName; 18 } 19 20 21 public void setObserverName(String observerName) { 22 this.observerName = observerName; 23 } 24 25 26 public String getWeatherContent() { 27 return weatherContent; 28 } 29 30 31 public void setWeatherContent(String weatherContent) { 32 this.weatherContent = weatherContent; 33 } 34 35 36 public String getRemindThing() { 37 return remindThing; 38 } 39 40 41 public void setRemindThing(String remindThing) { 42 this.remindThing = remindThing; 43 } 44 45 /** 46 * 获取目标类的状态同步到观察者的状态中去 47 * */ 48 public void updata(WeatherSubject weatherSubject) { 49 weatherContent = ((ConcreteWeatherSubject)weatherSubject).getWeatherContent(); 50 System.out.println(observerName+"收到了。"+weatherContent+remindThing); 51 } 52 53 }
5、现在模式已经写完了,那么还差一个测试类:
1 public class Client { 2 3 /** 4 * 测试类 5 * @param args 6 */ 7 public static void main(String[] args) { 8 //1 创建目标 9 ConcreteWeatherSubject weather = new ConcreteWeatherSubject(); 10 11 //2 创建观察者 12 ConcreteObserver observerGirl = new ConcreteObserver(); 13 ConcreteObserver observerMum = new ConcreteObserver(); 14 observerGirl.setObserverName("女朋友"); 15 observerGirl.setRemindThing("咱们一块去约会吧,哈哈哈。。。。。"); 16 17 observerMum.setObserverName("丈母娘"); 18 observerMum.setRemindThing("适合去逛商场。"); 19 20 //3 注册观察者 21 weather.attach(observerGirl); 22 weather.attach(observerMum); 23 24 //4 目标发布天气 25 weather.setWeatherContent("明天天气晴朗,气温28度,蓝天白云。"); 26 } 27 28 }
运行结果: