head first 设计模式 Observer模式

策略模式:定义了对象之间的一对多依赖,这样一来,这样一来当一个发生改变的时候,它的所有依赖都会发生变化
观察者模式代码如下
1主题接口也就是那个可能会发生数据变化
public interface Subject
{
      //将观察者注入到主题中
      public void registerObserver(Observer o );
      //将观察者从主题中去除
      public void removeObserver(Observer o );
      //当主题的数据发生变化的时候,这个方法会通知所有的观察者
      public void notifyObserver();
}
2观察者接口,当数据发生变化的时候这里会随之发生变化
public interface Observer
{
      //当主题状态改变时,这个方法会被调用,以通知所有的观察者
      public void update( float temp , float humidity , float pressure );
}

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

4主题的实现类也就是1的实现类
//数据类
public class WeatherData implements Subject
{
      //设置观察者的数组
      private ArrayList observer ;
      private float temp ;
      private float humidity ;
      private float pressure ;
      //初始化的时候创建数组,这个用来存放观察者集合
      public WeatherData()
     {
          observer = new ArrayList();
     }
      // 注册
      @Override
      public void registerObserver(Observer o )
     {
          observer .add( o );
     }
      // 删除
      @Override
      public void removeObserver(Observer o )
     {
          int i = observer .indexOf( o );
          //查找到的情况下才删除
          if ( i >=0)
         {
               observer .remove( i );
         }
     }
      //通知每一位观察者
      @Override
      public void notifyObserver()
     {
          for ( int i =0; i < observer .size(); i ++)
         {
              Observer o =(Observer) observer .get( i );
               o .update( temp , humidity , pressure );
         }
     }
      //从气象站得到更新时反馈给观察者
      public void measurementsChanged()
     {
         notify();
     }
      //监测站更细数据
      public void setMeasurement( float temp , float humidity , float pressure )
     {
          this . temp = temp ;
          this . humidity = humidity ;
          this . pressure = pressure ;
     }
}

5观察者类实现了观察者接口以及使数据更新的更新接口
public class CurentConditionsDisplay implements Observer,DisplayElement
{
      private float temperature ;
      private float humidity ;
      private Subject weathData ;
      //将布告板注册到主题中
      public CurentConditionsDisplay(Subject weathData )
     {
         
          this . weathData = weathData ;
          weathData .registerObserver( this );
     }
      //更新
      public void update( float temp , float humidity , float pressure )
     {
          this . humidity = humidity ;
         display();
         
     }
      //展示
      @Override
      public void display()
     {
          System. out .println( "CurrentConditions" + humidity );
         
     }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值