所有分类
  • 所有分类
  • 未分类

观察者模式Java实战-写法2:JDK

简介

说明

本文用示例介绍观察者模式的JDK写法。

本写法的优缺点

优点

  1. 比纯手写稍微简单一点。

缺点

  1. 需要手动注册观察者,不能自动地去感知。
  2. 观察者只能有一个JDK指定的方法:update,不能改为其他名字。
  3. 不能方便地指定观察者的执行顺序。(不过观察者中一般不需要指定顺序)

JDK的观察者模式简介

在 Java 中,java.util.Observable 类和 java.util.Observer 接口定义了观察者模式,只要实现这两个接口就可以编写观察者模式。

1. Observable

Observable 类是抽象目标类(被观察者),它有一个 Vector 集合成员变量,用于保存所有要通知的观察者对象,下面来介绍它最重要的 3 个方法。

  • void addObserver(Observer o) 方法:用于将新的观察者对象添加到集合中。
  • void notifyObservers(Object arg) 方法:调用集合中的所有观察者对象的 update方法,通知它们数据发生改变。通常越晚加入集合的观察者越先得到通知。
  • void setChange() 方法:用来设置一个 boolean 类型的内部标志,注明目标对象发生了变化。当它为true时,notifyObservers() 才会通知观察者。

2. Observer

Observer 接口是抽象观察者,它监视目标对象的变化,当目标对象发生变化时,观察者得到通知,并调用 update 方法,进行相应的工作。

实例

本处使用一个贴近真实场景的案例:订单取消时,要有一系列操作,比如:账户业务需要给用户退钱、库存业务需要给商品退回数量。

在这个场景中,取消订单就是被观察者,账户业务和库存业务是观察者。

项目结构

代码

此内容仅限VIP查看,请先

测试 

测试类

package com.knife.designPattern.controller;

import com.knife.designPattern.bo.CancelOrderBO;
import com.knife.designPattern.subject.SubjectHolder;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Api(tags = "订单")
@RestController
@RequestMapping("order")
public class OrderController {
    @ApiOperation("取消订单")
    @PostMapping("cancel")
    public String cancel(@RequestBody CancelOrderBO cancelOrderBO) {
        SubjectHolder.process(cancelOrderBO);
        return "success";
    }
}

访问接口

启动项目后,访问Knife4j(接口文档)的地址:http://localhost:8080/doc.html

(当然,你用postman也完全可以)

结果

库存业务开始处理订单取消。接收到的消息:CancelOrderBO(orderNo=666)
账户业务开始处理订单取消。接收到的消息:CancelOrderBO(orderNo=666)

1

评论0

请先

显示验证码
没有账号?注册  忘记密码?

社交账号快速登录