java设计模式:观察者模式

在平常的开发工作中,经常会使用到设计模式。合理的使用设计模式,可以提高开发效率、提高代码质量、提高代码的可拓展性和维护性。今天来聊聊观察者模式。

观察者模式是一种行为型设计模式,用于对象之间一对多的依赖关系,当被观察对象发生变化时会通知所有观察者进行相应的更新。

在观察者模式中,主要包括:

1:主题(Subject):定义了被观察的对象,存储了观察者的列表,并提供了方法用于增加、删除和通知观察者的方法。

2:观察者(Observer):定义了一个接口或者抽象类,通常包括更新方法,在主题更新时调用。

3:具体主题(Concrete Subject):实现主题接口,将状态变化通知给观察者。

4:具体观察者(Concrete Observer):实现观察者接口,负责接受主题的更新并更新自身的状态。

使用场景:

1:当一个对象的改变需要同时通知给其他多个对象。可以使用观察者模式。

2:当一个对象需要广播通知给其他多个对象,可以使用观察者模式。

简单示例:

主题接口:

java 复制代码
package test.boot.observer;

public interface Subject {

    void registerObserver(Observer observer);

    void delObserver(Observer observer);

    void notifyObservers();

}

主题实现类:

java 复制代码
package test.boot.observer;

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

public class SubjectImpl implements Subject {

    private List<Observer> observerList = new ArrayList<>();

    private String msg;

    @Override
    public void registerObserver(Observer observer) {
        observerList.add(observer);
    }

    @Override
    public void delObserver(Observer observer) {
        observerList.remove(observer);
    }

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

   
    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
        notifyObservers();
    }

}

观察者接口:

java 复制代码
package test.boot.observer;

public interface Observer {

    void update(String msg);

}

观察者1:

java 复制代码
package test.boot.observer;

public class ObserverFirstImpl implements Observer{
    @Override
    public void update(String msg) {
        System.out.println("ObserverFirstImpl update " + msg);
    }
}

观察者2:

java 复制代码
package test.boot.observer;

public class ObserverSecondImpl implements Observer{
    @Override
    public void update(String msg) {
        System.out.println("ObserverSecondImpl update " + msg);
    }
}

测试类:

java 复制代码
package test.boot.observer;

public class ObserverTest {

    public static void main(String[] args) {
        SubjectImpl subject = new SubjectImpl();
        Observer observerA = new ObserverFirstImpl();
        Observer observerB = new ObserverSecondImpl();

        subject.registerObserver(observerA);
        subject.registerObserver(observerB);

        subject.setMsg("hello");
        subject.setMsg("world");
    }

}

运行结果:

以上为观察者模式简单示例,加油!美好的风景一直在路上,期待遇见更好的自己!

相关推荐
秋饼2 分钟前
Spring AI + MCP 工具调用可靠性实战:参数校验、权限防线与人工确认生产级落地
java·ai·技术分享·后端开发
步行cgn5 分钟前
RESTful 是什么?怎么记住它?
java
随性而行3606 分钟前
企业微信 Webhook 接收不到消息?网络连通性、URL 签名验签与 API 返回错误码排查指南
java·网络·人工智能·后端·微信·企业微信
薛之谦_7 分钟前
JD Hotkey 项目实战:京东开源的热点探测与秒杀系统
java·安全
yuzhiboyouye8 分钟前
@EnumValue和@JsonValue
java
相隔一个图书馆的距离14 分钟前
单测(三)Spring Boot 3.5.6 && @MockitoSpyBean / AOP / 循环依赖:静默吞错与运行期 NPE
java·spring boot·后端
软件技术NINI23 分钟前
基于JavaWeb 汽车租聘
java·vue.js·spring boot·后端·python·毕业设计·毕设
yz_aiks26 分钟前
RestTemplate 废弃后迁移 RestClient 实战:Spring Boot 4.2 升级指南
java·spring boot·后端·微服务·restclient
wuminyu33 分钟前
JVM规范学习总结-JVM规范基本概念
java·linux·c语言·jvm·c++
时间静止不是简史4 小时前
生产事故排查:Redis 宕机导致补偿队列消费线程死亡,通话录音未上送业务平台
java·redis