观察者模式简单理解

这里介绍的只是这种模式中最简单的部分。这里的特点就是“统一通知,各自处理”。先看下项目结构:

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 }

运行结果:

原文地址:https://www.cnblogs.com/huolongluo/p/6344133.html