设计模式:观察者模式

前言

在使用 Java 写代码的过程中,我们经常遇到需要拓展功能的情况,为了代码更加灵活,我们必须学习设计模式。


实现截图

image.png

观察者模式

观察者模式=主题+观察者

类似报社订阅者发放报纸:
1. 订阅者订阅报纸,以后每当新闻出现,订阅者都会收到报社的新报纸。
2. 订阅者取消订阅后,报社不再发放报纸。
3. 一家报社对应多个订阅者。


实现原理

两个接口:

SubjectObserver
registerObserver(Observer observer);update(data)
removeObserver(Observer observer)
notifyObserver()

实现类分为两种:主题类和观察者类

代码 Example

我们弃用面向实现编程,代码使用面向接口编程,说人话就是:抽离出代码中变化的部分,放到功能接口里。

定义了一个天气数据主题,当天气发生改变时,观察者实现类收到通知就更新数据。

  • 主题接口
public interface Subject {
     void registerObserver(Observer observer);
     void removeObserver(Observer observer);
     void notifyObserver();
}
  • 观察者接口
public interface Observer {

    void update(double temp,double humdity,double pressure);
}
  • 显示接口
public interface DispayElement {
    void display();
}
  • 主题实现类
import java.util.ArrayList;
import java.util.List;

public class WeatherData implements Subject {

    private List observerList;
    private double temp;
    private double humdity;
    private double pressure;

    public WeatherData(){
        observerList=new ArrayList();
    }
    //注册观察者
    @Override
    public void registerObserver(Observer observer) {
    observerList.add(observer);
    }

    //移除观察者
    @Override
    public void removeObserver(Observer observer) {
    int index=observerList.indexOf(observer);
    observerList.remove(index);
    }


    @Override
    public void notifyObserver() {
    for(int i=0;i<observerList.size();i++){
       Observer observer= (Observer) observerList.get(i);
       observer.update(temp,humdity,pressure);
    }
    }

    public void setInfo(double temp,double humdity,double pressure){
        this.temp=temp;
        this.humdity=humdity;
        this.pressure=pressure;
        notifyObserver();
    }

}

  • 观察者实现类
public class CurrentConditionDisplay implements Observer,DispayElement {

    private double temp;
    private double humdity;
    private WeatherData weatherData;

    public CurrentConditionDisplay(WeatherData weatherData){
        this.weatherData=weatherData;
        weatherData.registerObserver(this);
    }


    @Override
    public void display() {
     System.out.println("CurrentConditionDisplay :"+temp+"F degrees and "+humdity+" & humdity");
    }

    @Override
    public void update(double temp, double humdity, double pressure) {
     this.temp=temp;
     this.humdity=humdity;
     display();
    }
}
  • 程序入口
public class Test {

    public static void main(String [] args){
      WeatherData weatherData=new WeatherData();

      CurrentConditionDisplay currentConditionDisplay=new CurrentConditionDisplay(weatherData);

      weatherData.setInfo(10,20,30);
      weatherData.setInfo(20,50,70);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值