发布订阅模式

概述

发布—订阅模式又叫观察者模式,它定义了对象间的一种一对多的关系,让多个观察者对象同时监听某一个主题对象,当一个对象发生改变时,所有依赖于它的对象都将得到通知。

其中包含三个对象:发布者,订阅者,发布中心,接下来就进行代码的编写

代码编写

发布者与订阅者

其中id就是发布者与订阅者的唯一标识

//发布者
class Publisher{
    private Integer id;
    public Publisher(Integer id){
        this.id = id;
    }
    public Integer getId(){
        return id;
    }
}

//订阅者
class Subscripter{
    private Integer id;
    public Subscripter(Integer id){
        this.id = id;
    }
    public Integer getId(){
        return id;
    }
}

中心与消息

//消息
class Message{
    String content;
    public Message(String content){
        this.content = content;
    }
    public String getContent(){
        return content;
    }
}

//发布订阅中心需要实现的功能
interface PublishAndSubscriptionService{
    //订阅
    public boolean subscribe(Subscripter subscripter,Publisher publisher);
    //取消订阅
    public boolean unsubscribe(Subscripter subscripter,Publisher publisher);
    //发送消息
    public void sendMessage(Publisher publisher,Message message);
}

//具体的发布订阅中心
class PubAndSubCenter implements PublishAndSubscriptionService{
    private Map<Integer, Set<Integer>> map;
    public PubAndSubCenter(){
        map = new HashMap<>();
    }

    @Override
    public boolean subscribe(Subscripter subscripter, Publisher publisher) {
        //发布者id
        Integer publisherId = publisher.getId();
        //订阅者id
        Integer subscripterId = subscripter.getId();
        //这个发布者有那些id
        Set<Integer> subIds = map.getOrDefault(publisherId, new HashSet<Integer>());
        boolean flag = subIds.add(subscripterId);
        if(flag){
            return map.put(publisherId, subIds) != null;
        }
        return false;
    }

    @Override
    public boolean unsubscribe(Subscripter subscripter, Publisher publisher) {
        //发布者id
        Integer publisherId = publisher.getId();
        //订阅者id
        Integer subscripterId = subscripter.getId();
        //这个发布者有那些id
        Set<Integer> subIds = map.getOrDefault(publisherId, new HashSet<Integer>());
        boolean flag = subIds.remove(subscripterId);
        if(flag){
            return map.put(publisherId,subIds) != null;
        }
        return false;
    }

    @Override
    public void sendMessage(Publisher publisher, Message message) {
        Integer publisherId = publisher.getId();
        Set<Integer> subIds = map.getOrDefault(publisherId, new HashSet<Integer>());
        for (Integer subId : subIds) {
            System.out.println("发布者 ["+publisherId+"] 给订阅者 ["+subId+"] 发布了消息 ["+message.getContent()+"]");
        }
    }

代码测试

//两个发布者
        Publisher p1 = new Publisher(1);
        Publisher p2 = new Publisher(2);

        //两个订阅者
        Subscripter s1 = new Subscripter(1);
        Subscripter s2 = new Subscripter(2);

        //发布订阅中心
        PubAndSubCenter center = new PubAndSubCenter();

        //s1订阅p1
        center.subscribe(s1,p1);
        //s1订阅p2
        center.subscribe(s1,p2);
        //s2订阅p1
        center.subscribe(s2,p1);

        //发布消息
        center.sendMessage(p1,new Message("p1发送message"));
        center.sendMessage(p2,new Message("p2发送message"));

        System.out.println("=================================");
        //s1取消订阅p1
        center.unsubscribe(s1,p1);
        center.sendMessage(p1,new Message("p1发送message"));
        System.out.println("==================================");
  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白羽uou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值