(五)观察者模式

概念

观察者模式属于行为型模式。是对象之间多对一依赖的一种设计方案,当一个对象被修改时,则会自动通知依赖它的对象,被依赖的对象为Subject(一的一方),依赖的对象为Observer(多的一方);
该模式与之前写的事件通知(https://www.jianshu.com/p/97ffd1f8890d)思想一致,详情可以查看

应用场景举例

天气时时推送,天气数据中心是用于存储天气数据,并提供一个第三方接口用于天气数据推送,有百度,新浪等网址接入到天气数据中心来获取天气数据,这就可以使用到观察者模式。

UML

观察者模式

代码

  • 天气类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Wether {
    private float temperature;
    private float humidity;
}
  • 被依赖抽象接口
public interface Subject {
    //新增观察者
    void add(Observer observer);
    //移除观察者
    void remove(Observer observer);
    //通知观察者
    void inform();
}
  • 天气中心
@Data
public class WetherData implements Subject{
    private Wether wether;
    private List<Observer> observers;

    public WetherData(){
        observers=new ArrayList<>();
    }
    @Override
    public void add(Observer observer) {
        if (!observers.contains(observer)){
            observers.add(observer);
        }
    }

    @Override
    public void remove(Observer observer) {
        if (observers.contains(observer)){
            observers.remove(observer);
        }
    }

    @Override
    public void inform() {
        observers.forEach(s->s.getWether(this.wether));
    }
}
  • 观察者抽象接口
public interface Observer {
   //获取天气数据
    void getWether(Wether wether);
}
  • 新浪
public class Xinlang implements Observer {
    @Override
    public void getWether(Wether wether) {
        System.out.println("新浪--今日湿度:"+wether.getHumidity());
        System.out.println("新浪--今日温度:"+wether.getTemperature());
    }
}
  • 百度
public class Baidu implements Observer {
    @Override
    public void getWether(Wether wether) {
        System.out.println("百度--今日湿度:"+wether.getHumidity());
        System.out.println("百度--今日温度:"+wether.getTemperature());
    }
}

spring源码应用解析

  • java.util.Observable


    图片.png
  • 观察者


    图片.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。