Java设计模式2:观察者模式1

本文介绍了一种常用的设计模式——观察者模式,详细解释了其工作原理,并通过一个气象站数据实时播报的案例进行了具体实现。该模式允许一个对象的状态变化能够通知到多个观察者对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.观察者模式
1.观察者模式定义了对象间的一种一对多依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新
2.它将观察者和被观察者的对象分离开。提高了应用程序的可维护性和重用性。
3.实现观察者模式有很多形式,一种是“注册—通知—撤销注册”的形式。
4.分类:
Subject(主题)
Observer(观察者)
这里写图片描述
这里写图片描述

二.案例
1.气象站的数据被各大电视台即时报导
◆interface Subject.java (主题父接口(可有多个不同子主题实现))

package tiglle.pattern.Observer;
//主题父接口(可有多个不同子主题实现)
public interface Subject {

    //注册观察者
    public void registerObserver(Observer o);

    //删除观察者
    public void removeObserver(Observer o);

    //当主题状态发生改变,调用此方法通知观察者
    public void notifyObserver();
}

◆interface Observer.java(观察者父接口(可由多个不同子观察者实现))

package tiglle.pattern.Observer;
//观察者父接口(可由多个不同子观察者实现)
public interface Observer {

    //当主题状态发生改变,会调用此方法并传入主题的参数
    public void update(int wendu,int shidu,int qiya);

}

◆class WeatherData.java(主题的一个子主题实现类(气象站))

package tiglle.pattern.Observer;

import java.util.ArrayList;
import java.util.List;

//主题的一个子主题实现类(气象站)
public class WeatherData implements Subject{

    //天气参数
    private int wendu;//温度
    private int shidu;//湿度
    private int qiya;//气压

    //记录注册的观察者
    private List<Observer> observers;

    //构造方法,实例化observers
    public WeatherData(){
        observers = new ArrayList<>();
    }

    //注册观察者
    @Override
    public void registerObserver(Observer o) {
        observers.add(o);
    }

    //移除观察者
    @Override
    public void removeObserver(Observer o) {
        int index = observers.indexOf(o);
        if(index>=0){
            observers.remove(index);
        }
    }

    //当主题状态发生改变,调用此方法通知观察者
    @Override
    public void notifyObserver() {
        for(Observer o:observers){
            o.update(wendu, shidu, qiya);
        }
    }

    //天气(主题子类)发生改变调用的方法,通知观察者
    public void weatherChanged(){
        //真正通知观察者
        notifyObserver();
    }

    //设置天气参数,并通知观察者
    public void setWeatherParame(int wendu,int shidu,int qiya){
        this.wendu = wendu;
        this.shidu = shidu;
        this.qiya = qiya;
        //通知观察者
        weatherChanged();
    }

}

◆interface Report.java(报导天气接口)

package tiglle.pattern.Observer;
//报导天气接口
public interface Report {

    public void report();

}

◆class HuNanTv.java(湖南电视台:观察者一个子实现类)

package tiglle.pattern.Observer;
//湖南电视台:观察者一个子实现类
public class HuNanTv implements Observer,Report{

    //天气属性
    private int wendu;
    private int shidu;
    private int qiya;

    //主题子实现类,用于构造函数中注册观察者
    private Subject subject;

    //构造函数,注册观察者
    public HuNanTv(Subject subject) {
        this.subject = subject;
        subject.registerObserver(this);
    }

    //改变天气属性
    @Override
    public void update(int wendu, int shidu, int qiya) {
        this.wendu = wendu;
        this.shidu = shidu;
        this.qiya = qiya;
        //报导天气
        report();
    }

    //报导天气
    @Override
    public void report() {
        System.out.println("湖南人民注意了,当前温度:"+wendu+",当前湿度:"+shidu+",当前气压:"+qiya);
    }

}

◆class HuBeiTv.java

package tiglle.pattern.Observer;
//湖北电视台:观察者一个子实现类
public class HuBeiTv implements Observer,Report{

    //天气属性
    private int wendu;
    private int shidu;
    private int qiya;

    //主题子实现类,用于构造函数中注册观察者
    private Subject subject;

    //构造函数,注册观察者
    public HuBeiTv(Subject subject) {
        this.subject = subject;
        subject.registerObserver(this);
    }

    @Override
    public void update(int wendu, int shidu, int qiya) {
        this.wendu = wendu;
        this.shidu = shidu;
        this.qiya = qiya;
        //报导天气
        report();
    }

    //报导天气
    @Override
    public void report() {
        System.out.println("湖北人民注意了,当前温度:"+wendu+",当前湿度:"+shidu+",当前气压:"+qiya);
    }
}

◆class MainExec.java(客户端(测试main方法))

package tiglle.pattern.Observer;
//客户端(测试main方法)
public class MainExec {

    public static void main(String[] args) {
        //实例化气象站(主题)
        WeatherData weatherData = new WeatherData();

        //实例化电视台(观察者),并注册进主题
        Observer hunanTv = new HuNanTv(weatherData);
        Observer hubeiTv = new HuBeiTv(weatherData);

        //当气象站(主题)发生变化,电视台(观察者)马上进行报道
        weatherData.setWeatherParame(32, 25, 30);
        weatherData.setWeatherParame(10, 20, 30);
        weatherData.setWeatherParame(50, 60, 70);
    }
}

运行结果:
湖南人民注意了,当前温度:32,当前湿度:25,当前气压:30
湖北人民注意了,当前温度:32,当前湿度:25,当前气压:30

湖南人民注意了,当前温度:10,当前湿度:20,当前气压:30
湖北人民注意了,当前温度:10,当前湿度:20,当前气压:30

湖南人民注意了,当前温度:50,当前湿度:60,当前气压:70
湖北人民注意了,当前温度:50,当前湿度:60,当前气压:70

此时不用改变主题代码,可以随意添加观察者数量

类图:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值