d7观察者模式通知消息服务

本文深入解析观察者模式,包括其定义、应用场景、原理类图及多个代码实例,涵盖自定义实现、JDK内置及SpringBoot事件通知机制,帮助读者全面理解观察者模式的运用。

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

1.什么是观察者模式

在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新。
其实就是发布订阅模式,发布者发布信息,订阅者获取信息,订阅了就能收到信息,没订阅就收不到信息。

2.观察者模式应用场景

Zookeeper事件通知节点、消息订阅通知、安卓开发事件注册
分布式配置中心

3. 观察者模式原理类图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4. 代码实例1

4.1抽象观察者

public interface ObServer {


    /**
     * 通知观察者消息
     *
     * @param message
     */
    void update(String message);

}

4.2抽象主题

public interface AbstractSubject {
    /**
     * 添加观察者  注册观察者
     */
    void addObServer(ObServer obServer);

    /**
     * 移除观察者
     *
     * @param obServer
     */
    void removeServer(ObServer obServer);

   
    /**
     * 通知消息
     */
    void notifyObServer(String message);
}

4.3 具体主题

public class WeChatSubject implements AbstractSubject {
    /**
     * 如何存放这些主题
     *
     * @param obServer
     */

    private List<ObServer> obServerList = new ArrayList<ObServer>();


    public void addObServer(ObServer obServer) {
        // 注册或者添加观察者
        obServerList.add(obServer);
    }

    public void removeServer(ObServer obServer) {
        obServerList.remove(obServer);
    }


    public void notifyObServer(String message) {
        System.out.println("开始设置微信群发消息:" + message);
        // 调用观察者通知方案
        for (int i = 0; i < obServerList.size(); i++) {
            ObServer obServer = obServerList.get(i);
            // 调用该方法通知 获取具体的消息  群发
            obServer.update(message);
        }

    }


}

4.4具体观察者

public class UserObServer implements ObServer {
    private String name;

    public UserObServer(String name) {
        this.name = name;
    }

    public void update(String message) {
        System.out.println(name + ",老师收到微信服务通知的消息:" + message);
    }
}

4.5测试:

public class Test001 {
    public static void main(String[] args) {

        // 1.创建具体的在主题
        AbstractSubject abstractSubject = new WeChatSubject();
        // 2.开始注册或者添加观察者
        abstractSubject.addObServer(new UserObServer("小薇"));
        abstractSubject.addObServer(new UserObServer("小敏"));
        // 3.群发消息
        abstractSubject.notifyObServer("让我们暴富吧");

    }
  }

5. 实例2

用户下单流程 添加订单 发送短信、发邮件、发微信模版通知
* 用户下单
* 发送邮件
* 发送微信模版

在这里插入图片描述
源码默认值是false,不群发
在这里插入图片描述

5.1 具体主题

public class MessageObServable extends Observable {


    @Override
    public void notifyObservers(Object arg) {
        // 1.修改状态为可以群发
        setChanged();
        // 2.调用父类的notifyObservers 群发消息
        super.notifyObservers(arg);
    }
}

5.2 3个具体观察者:

public class SmsObServer implements Observer {
    public void update(Observable o, Object arg) {
        System.out.println("用户下单成功,发送短信提醒内容:" + arg);
    }
}
public class WechatObServer implements Observer {
    public void update(Observable o, Object arg) {
        System.out.println("用户下单成功,发送微信体醒内容:" + arg);
    }
}
public class EmailObServer implements Observer {
    public void update(Observable o, Object arg) {
        System.out.println("用户下单成功,发送邮件提醒内容:" + arg);
    }
}

5.3 测试:

public class TestJdkObServer {
    public static void main(String[] args) {
        // 1.创建具体的主题
        Observable observable = new MessageObServable();
        // 2. 注册观察者
        observable.addObserver(new SmsObServer());
        observable.addObserver(new WechatObServer());
        observable.addObserver(new EmailObServer());
        // 3.群发消息
        observable.notifyObservers("恭喜以1399元购买永久会员一份");
    }
    /**
     * Spring 中项目启动的时候 将这些观察者注册到 主题中 调用notifyObservers群发消息
     */
}

6. spring boot 事件通知底层原理 (实例3)

@Data
public class OrderMessageEvent extends ApplicationEvent {
    /**
     * 群发消息的内容
     */
    private JSONObject jsonObject;

    public OrderMessageEvent(Object source, JSONObject jsonObject) {
        super(source);
        this.jsonObject = jsonObject;
    }
   
}

观察者:

@Component
public class EmailListener implements ApplicationListener<OrderMessageEvent> {
    @Override
    @Async
    public void onApplicationEvent(OrderMessageEvent event) {
        //如何获取到当前容器下面所有的观察者呢?反射机制获取ApplicationListener 接口下面子类
        System.out.println(Thread.currentThread().getName()+"开始发送邮件消息内容:" + event.getJsonObject().toJSONString());
    }
}
@Component
public class SmsListener implements ApplicationListener<OrderMessageEvent> {
    @Override
    @Async
    public void onApplicationEvent(OrderMessageEvent event) {
        System.out.println(Thread.currentThread().getName() + "开始短信消息内容:" + event.getJsonObject().toJSONString());
    }
}

测试:

@RestController
public class OrderController {
    @Autowired
    private ApplicationContext applicationContext;

    @RequestMapping("/sendMsg")
    public String sendMsg() {
        //1.定义发送消息内容
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("email", "644064779@qq.com");
        jsonObject.put("phone", "15123456789");
        jsonObject.put("text", "恭喜您以1399.00元购买永久会员.");
        OrderMessageEvent orderMessageEvent = new OrderMessageEvent(this, jsonObject);
        applicationContext.publishEvent(orderMessageEvent);
        return "success";
    }
}

启动类

@SpringBootApplication
@EnableAsync
public class AppObServer {
    public static void main(String[] args) {
        SpringApplication.run(AppObServer.class);
    }
}

异步 2个线程
在这里插入图片描述

启动类关掉 异步
变成单线程
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值