zoukankan      html  css  js  c++  java
  • 观察者模式简单理解

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

    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 }

    运行结果:

  • 相关阅读:
    51Nod1119
    stoi
    坑爹大质数
    USACO07OPEN Cheapest Palindrome
    USACO08NOV Mixed Up Cows
    USACO12FEB Nearby Cows
    SCOI2009 粉刷匠
    USACO16OPEN 248
    POI2014 PTA-Little Bird
    USACO17FEB Why Did the Cow Cross the Road I G
  • 原文地址:https://www.cnblogs.com/huolongluo/p/6344133.html
Copyright © 2011-2022 走看看