首页 > 编程语言 >Java编程--观察者(Observer)设计模式

Java编程--观察者(Observer)设计模式

时间:2024-03-07 19:46:38浏览次数:29  
标签:Java temperature Observer void 观察者 Fan 设计模式 public

观察者设计模式

观察者设计模式是一种行为设计模式,允许对象在其状态改变时通知其他依赖对象。它创建了一种发布者(Subject)和订阅者(Observer)之间的依赖关系。这种模式经常用于实现事件处理系统。

观察者模式的关键组成部分:

Subject(主题):拥有添加和删除观察者的方法,以及通知所有观察者状态变化的方法。

Observer(观察者):所有观察者需要实现的接口,定义了当主题状态改变时需要调用的更新方法。

ConcreteSubject(具体主题):实现Subject接口,当其状态改变时,会向所有的观察者发出通知。

ConcreteObserver(具体观察者):实现Observer接口,定义当接收到主题状态变化通知时如何更新自己。

示例实现

以下是一个简单的观察者模式示例,演示了一个简单的天气应用,其中WeatherStation作为Subject,当天气更新时,它会通知所有注册的观察者。

/**
 * Observer(观察者):所有观察者需要实现的接口,定义了当主题状态改变时需要调用的更新方法。
 */
interface Observer {
    void update(float temperature);
}

/**
 * Subject(主题):拥有添加和删除观察者的方法,以及通知所有观察者状态变化的方法。
 */
interface Subject {
    void addObserver(Observer o);
    void removeObserver(Observer o);
    void notifyObservers();
}

/**
 * ConcreteSubject(具体主题):实现Subject接口,当其状态改变时,会向所有的观察者发出通知。
 */
class WeatherStation implements Subject {
    private final List<Observer> observers;
    private float temperature;

    public WeatherStation() {
        this.observers = new ArrayList<>();
    }

    @Override
    public void addObserver(Observer o) {
        observers.add(o);
    }

    @Override
    public void removeObserver(Observer o) {
        observers.remove(o);
    }

    @Override
    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(temperature);
        }
    }

    public void setTemperature(float temperature) {
        this.temperature = temperature;
        notifyObservers();
    }
}

/**
 * 温度显示器
 * ConcreteObserver(具体观察者):实现Observer接口,定义当接收到主题状态变化通知时如何更新自己。
 */
class TemperatureDisplay implements Observer {
    @Override
    public void update(float temperature) {
        System.out.println("TemperatureDisplay: Temperature changed to: " + temperature);
    }
}

/**
 * 风扇
 * ConcreteObserver(具体观察者):实现Observer接口,定义当接收到主题状态变化通知时如何更新自己。
 */
class Fan implements Observer {
    @Override
    public void update(float temperature) {
        if(temperature > 25) {
            System.out.println("Fan turned on");
        } else {
            System.out.println("Fan turned off");
        }
    }
}

/**
 * 测试观察者模式
 */
public class ObserverPatternDemo {
    public static void main(String[] args) {
        WeatherStation station = new WeatherStation();
        TemperatureDisplay display = new TemperatureDisplay();
        Fan fan = new Fan();

        station.addObserver(display);
        station.addObserver(fan);

        station.setTemperature(30);
        station.setTemperature(20);
    }
}

解释:

WeatherStation(具体主题)管理观察者列表并在天气(这里是温度)改变时通知它们。

TemperatureDisplayFan(具体观察者)实现了Observer接口,定义了如何在接收到温度更新时响应。

WeatherStationsetTemperature方法被调用时,它会更新温度并通知所有观察者,观察者随后根据更新的信息进行相应的操作。

运行结果:

TemperatureDisplay: Temperature changed to: 30.0
Fan turned on
TemperatureDisplay: Temperature changed to: 20.0
Fan turned off

标签:Java,temperature,Observer,void,观察者,Fan,设计模式,public
From: https://www.cnblogs.com/zjw-blog/p/18059579

相关文章

  • MyBatis Java 和 数据库 数据类型对应表
    类型处理器(typeHandlers)MyBatis在设置预处理语句(PreparedStatement)中的参数或从结果集中取出一个值时,都会用类型处理器将获取到的值以合适的方式转换成Java类型。下表描述了一些默认的类型处理器。提示 从3.4.5开始,MyBatis默认支持JSR-310(日期和时间API)。类型处......
  • Java日期
    Java8之前的传统日期APIDate转换成字符串importjava.text.SimpleDateFormat;importjava.util.Date;/***@authorPickle*@versionV1.0*@date2024/3/714:43*/publicclassDemo{publicstaticvoidmain(String[]args){//创建Date类,构造的......
  • Java取当前时间的一分钟后,并格式化输出
    1.Java1.8以前Calendarinstance=Calendar.getInstance();//获取当前日期时间instance.add(Calendar.MINUTE,1);//加1分钟System.out.println(newSimpleDateFormat("yyyy-MM-ddHH:mm:ss").format(instance.getTime()));2.Java1.8及以后System.out.println(DateTimeFor......
  • Java登陆第三十二天——前端工程化
    现如今项目结构臃肿,MAVEN中拥有前端+后端代码。为了提高效率和降低成本,前端也需要结构化的管理,但MAVEN管理前端较为麻烦工程独立之后也就是前后端分离。前后端分离的优点开发分离(最好人也分离)部署分离前端工程化实现技术栈前端工程化实现的技术栈有很多,我们采用......
  • java使用ssh通道连接mysql
    添加依赖<dependency><groupId>com.jcraft</groupId><artifactId>jsch</artifactId><version>0.1.55</version></dependency>添加配置importcom.jcraft.jsch.JSch;......
  • java 注解
    1、什么是注解      类似一种特殊的注释,可以在程序运行时被反射获取,如同标签。2、注解分类内置注解自定义注解内置注解Java定义了一套注解,共有7个,3个在java.lang中,剩下4个在java.lang.annotation中。作用在代码的注解:@Override-检查该方法是否是重......
  • macOS m1芯片报错 java.lang.UnsatisfiedLinkError: no taos in java.library.path
    项目中有用到TDengine,MacOSm1芯片本地开发启动项目报错如下java.lang.UnsatisfiedLinkError:notaosinjava.library.path方案一(推荐)以上错误是因为java在连接TDengine数据库的时候没有找到本地函数库。本地安装一下TDengine,然后在/usr/local/lib/下就会有taos函数库。因此......
  • java过滤器拦截路劲问题
    在我们使用filter过滤器时注解@WebFilter("/serverlet/demo1/")多层目录只针对文件注解@WebServlet(name="Servlet1",value="/serverlet/demo1/test1")具有过滤作用(原因:注解路径相同),其中“@WebFilter("/serverlet/demo1/")”括号里的*代表只要serverlet注解前半部分相同的文......
  • 熟悉又陌生的JavaWeb 第2天
    传送门JSP基本语法什么是servlet自定义Servlet,直接使用抽象好的HttpServlet更好MyCustomServletpublicclassMyCustomServletextendsHttpServlet{@SerialprivatestaticfinallongserialVersionUID=-599450886992695746L;@Overrideprotected......
  • c#与java之间的区别盘点
    原文链接:http://www.mobiletrain.org/about/BBS/119467.htmlhttps://blog.csdn.net/clpig0125/article/details/50774628C#(CSharp)是Microsoft开发的一种面向对象的编程语言,而Java是由SunMicrosystems开发的一种面向对象的编程语言。虽然它们都是面向对象的编程语言,但它们之......