head first 设计模式 Observer模式

来源:互联网 发布:opencv python视频教程 编辑:程序博客网 时间:2024/05/28 06:05
策略模式:定义了对象之间的一对多依赖,这样一来,这样一来当一个发生改变的时候,它的所有依赖都会发生变化
观察者模式代码如下
1主题接口也就是那个可能会发生数据变化
publicinterfaceSubject
{
     //将观察者注入到主题中
     publicvoidregisterObserver(Observero);
     //将观察者从主题中去除
     publicvoidremoveObserver(Observero);
     //当主题的数据发生变化的时候,这个方法会通知所有的观察者
     publicvoidnotifyObserver();
}
2观察者接口,当数据发生变化的时候这里会随之发生变化
publicinterfaceObserver
{
     //当主题状态改变时,这个方法会被调用,以通知所有的观察者
     publicvoidupdate(floattemp,floathumidity,floatpressure);
}

3更新数据的显示接口,他只负责更新数据
publicinterfaceDisplayElement
{
     //当布告板需要显示时调用此方法
     publicvoiddisplay();
}

4主题的实现类也就是1的实现类
//数据类
publicclassWeatherDataimplementsSubject
{
     //设置观察者的数组
     privateArrayListobserver;
     privatefloattemp;
     privatefloathumidity;
     privatefloatpressure;
     //初始化的时候创建数组,这个用来存放观察者集合
     publicWeatherData()
     {
         observer=newArrayList();
     }
     // 注册
     @Override
     publicvoidregisterObserver(Observero)
     {
         observer.add(o);
     }
     // 删除
     @Override
     publicvoidremoveObserver(Observero)
     {
         inti=observer.indexOf(o);
         //查找到的情况下才删除
         if(i>=0)
         {
              observer.remove(i);
         }
     }
     //通知每一位观察者
     @Override
     publicvoidnotifyObserver()
     {
         for(inti=0;i<observer.size();i++)
         {
              Observero=(Observer)observer.get(i);
              o.update(temp,humidity,pressure);
         }
     }
     //从气象站得到更新时反馈给观察者
     publicvoidmeasurementsChanged()
     {
         notify();
     }
     //监测站更细数据
     publicvoidsetMeasurement(floattemp,floathumidity,floatpressure)
     {
         this.temp=temp;
         this.humidity=humidity;
         this.pressure=pressure;
     }
}

5观察者类实现了观察者接口以及使数据更新的更新接口
publicclassCurentConditionsDisplayimplementsObserver,DisplayElement
{
     privatefloattemperature;
     privatefloathumidity;
     privateSubjectweathData;
     //将布告板注册到主题中
     publicCurentConditionsDisplay(SubjectweathData)
     {
         
         this.weathData=weathData;
         weathData.registerObserver(this);
     }
     //更新
     publicvoidupdate(floattemp,floathumidity,floatpressure)
     {
         this.humidity=humidity;
         display();
         
     }
     //展示
     @Override
     publicvoiddisplay()
     {
          System.out.println("CurrentConditions"+humidity);
         
     }
}

我觉得这个设计模式在这个里面用的比较好的一点就是o.updata()这个更新方法将观察者进行了更新
还有它的核心就是一些在构造函数里面进行的一系列的初始化比如数组的初始化,以及在构造参数里面进行注册
,看着就好像是你中有我我中有你相互这件有关联的关系,但是观察者有多个,所以最后的结果就达到了一对多的关系
jdk自带的也有观察者模式但是会出现一系列的问题