java设计模式-观察者模式(jdk内置)

上一篇我们学习了 观察者模式

观察者和被观察者接口都是我们自己定义的,整个设计模式我们从无到有都是自己设计的,其实,java已经内置了这个设计模式,我们只需要定义实现类即可。

下面我们不多说明,直接示例代码,例子依然同 观察者模式篇章,建议先去看看。

/**
 * 被观察者具体实现, 实现jdk自带的类
 *
 * @author jiangkd
 * @date 2023/7/28 10:32:03
 */
@Component
public class WeChatMessage extends Observable {

    private String message;

    /**
     * 模拟被观察者的主题更新, 通知所有观察者
     *
     * @param message 主题更新
     */
    public void updateMessage(String message) {
        this.message = message;

        // 通知所有观察者
        this.setChanged();
        this.notifyObservers(message);
    }

}

两个观察者

/**
 * 具体的观察者1
 *
 * @author jiangkd
 * @date 2023/7/28 10:07:34
 */
@Slf4j
@Component
public class User1 implements Observer {

    /**
     * 观察者接收消息, 知道被观察者发生了变化, 自己进行相应的处理, 这里只是测试打印日志而已
     *
     * @param o   主题, 被观察者主题类型
     * @param arg 接受到的消息
     */
    @Override
    public void update(Observable o, Object arg) {
        if (o instanceof WeChatMessage) {
            log.info("我是具体的观察者之一:{}", this.getClass().getSimpleName());
            log.info("被观察者发生变化, 接收消息:{}", String.valueOf(arg));
        }
    }
}
/**
 * 具体的观察者2
 *
 * @author jiangkd
 * @date 2023/7/28 10:09:22
 */
@Slf4j
@Component
public class User2 implements Observer {

    /**
     * 观察者接收消息, 知道被观察者发生了变化, 自己进行相应的处理, 这里只是测试打印日志而已
     *
     * @param o   主题, 被观察者主题类型
     * @param arg 接受到的消息
     */
    @Override
    public void update(Observable o, Object arg) {
        if (o instanceof WeChatMessage) {
            log.info("我是具体的观察者之一:{}", this.getClass().getSimpleName());
            log.info("被观察者发生变化, 接收消息:{}", String.valueOf(arg));
        }
    }

}

测试:

/**
 * @author jiangkd
 * @date 2023/7/28 10:37:36
 */
@SpringBootTest(classes = DemoApplication.class)
@RunWith(SpringRunner.class)
@Slf4j
public class JdkObserverTest {

    @Resource
    WeChatMessage weChatMessage;

    @Resource
    User1 user1;

    @Resource
    User2 user2;

    @Test
    public void test(){

        // 依然绑定被观察者和观察者
        weChatMessage.addObserver(user1);
        weChatMessage.addObserver(user2);

        weChatMessage.updateMessage("测试一下1!!");

    }

}

执行结果记录日志:

2023-07-28 10:47:30.713 INFO 23796 — [ main] d.b.e.design_patterns.gczms.jdk.User2 : 我是具体的观察者之一:User2
2023-07-28 10:47:30.714 INFO 23796 — [ main] d.b.e.design_patterns.gczms.jdk.User2 : 被观察者发生变化, 接收消息:测试一下1!!
2023-07-28 10:47:30.714 INFO 23796 — [ main] d.b.e.design_patterns.gczms.jdk.User1 : 我是具体的观察者之一:User1
2023-07-28 10:47:30.714 INFO 23796 — [ main] d.b.e.design_patterns.gczms.jdk.User1 : 被观察者发生变化, 接收消息:测试一下1!!

然后测试注销其中一个观察者User1

@SpringBootTest(classes = DemoApplication.class)
@RunWith(SpringRunner.class)
@Slf4j
public class JdkObserverTest {

    @Resource
    WeChatMessage weChatMessage;

    @Resource
    User1 user1;

    @Resource
    User2 user2;

    @Test
    public void tes2(){

        // 依然绑定被观察者和观察者
        weChatMessage.addObserver(user1);
        weChatMessage.addObserver(user2);

        weChatMessage.updateMessage("在干什么");

        log.info("========================================");

        weChatMessage.deleteObserver(user1);

        weChatMessage.updateMessage("你过来一下");

    }

}

执行结果记录日志:

2023-07-28 10:48:38.946 INFO 17928 — [ main] d.b.e.design_patterns.gczms.jdk.User2 : 我是具体的观察者之一:User2
2023-07-28 10:48:38.947 INFO 17928 — [ main] d.b.e.design_patterns.gczms.jdk.User2 : 被观察者发生变化, 接收消息:在干什么
2023-07-28 10:48:38.948 INFO 17928 — [ main] d.b.e.design_patterns.gczms.jdk.User1 : 我是具体的观察者之一:User1
2023-07-28 10:48:38.948 INFO 17928 — [ main] d.b.e.design_patterns.gczms.jdk.User1 : 被观察者发生变化, 接收消息:在干什么
2023-07-28 10:48:38.948 INFO 17928 — [ main] d.b.e.d.gczms.JdkObserverTest : ========================================
2023-07-28 10:48:38.948 INFO 17928 — [ main] d.b.e.design_patterns.gczms.jdk.User2 : 我是具体的观察者之一:User2
2023-07-28 10:48:38.948 INFO 17928 — [ main] d.b.e.design_patterns.gczms.jdk.User2 : 被观察者发生变化, 接收消息:你过来一下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值