PubSub的简单实现

1. 发布者Publisher

package PubSub;
/**
* @Description: 发布者接口
* @Author: Henry
*/
public interface Publisher<M> {
    public void publish(PubSub pubsub,M message);
}

/**
* @Description: 发布实现类
* @Author: Henry
*/
public class PublisherImp<M> implements Publisher<M> {
    public String name;
    public PublisherImp(String name) {
        this.name = name;
    }
    /**
    * @Description:  将消息发布至pubsub
    * @Param: [pubsub, message]
    * @return: void
    * @Author: Henry
    */
    @Override
    public void publish(PubSub pubsub, M message) {
        System.out.println("【"+ this.name+"】发布了消息:"+message.toString());
        pubsub.publish(this, message);
        pubsub.publisherlist.add(this);
    }
}

2.订阅者Subcriber

package PubSub;
/**
* @Description: 订阅者接口
* @Author: Henry
*/
public interface Subcriber<M> {
    public void subcribe(PubSub pubsub);
    public void unsubcribe(PubSub pubsub);
    public void update(PublisherImp publisher,M message);
}
/**
* @Description: 订阅实现类
* @Author: Henry
*/ 
public class SubcriberImp <M> implements Subcriber<M>{
    public String name;
    public LinkedList<M> cache = new LinkedList<M>();
    public SubcriberImp(String name) {
        this.name = name;
    }
    /**
    * @Description:  订阅pubsub
    * @Param: [pubsub]
    * @return: void
    * @Author: Henry
    */
    @Override
    public void subcribe(PubSub pubsub) {
        pubsub.subcribe(this);
        System.out.println("【"+this.name+"】订阅了"+pubsub.name);
    }
    /**
    * @Description: 取消订阅pubsub
    * @Param: [pubsub]
    * @return: void
    * @Author: Henry
    */
    @Override
    public void unsubcribe(PubSub pubsub) {
        pubsub.unSubcribe(this);
        System.out.println("【"+this.name+"】取消订阅了"+pubsub.name);
    }
    /**
    * @Description:  获取消息
    * @Param: [publisher, message]
    * @return: void
    * @Author: Henry
    */
    @Override
    public void update(PublisherImp publisher, M message) {
            System.out.println("【"+ this.name+"】收到来自【"+publisher.name+"】发来的消息:"+message.toString());
            cache.add(message);
    }
}

3.订阅器PubSub

package PubSub;
/**
* @Description: 订阅器pubsub
* @Author: Henry
*/
public class PubSub<M> {
    //订阅器名称
    public String name;
    //订阅器队列容量
    final int CAPACITY = 20;
    //订阅器存储队列
    private BlockingQueue<Event> queue = new ArrayBlockingQueue<Event>(CAPACITY);
    //订阅者队列
    private List<SubcriberImp> subcriberlist  = new ArrayList<SubcriberImp>();

    public PubSub(String name) {
        this.name = name;
    }
    /**
    * @Description: 实现订阅者消息消费
    * @Param: [publisher, event]
    * @return: void
    * @Author: Henry
    */
    public void update(PublisherImp publisher, Event event) {
        for(SubcriberImp subcriber:subcriberlist){
            subcriber.update(publisher,event.context);
        }
    }
    /**
    * @Description: 实现发布者消息发布
    * @Param: [publisher, message]
    * @return: void
    * @Author: Henry
    */
    public void publish(PublisherImp publisher,M message) {
        System.out.print("目前已订阅的对象有: ");
        for (SubcriberImp sub : subcriberlist) {
            System.out.print(sub.name+",");
        }
        System.out.println();
        Event<M> msg = new Event<M>(publisher,message);
        if(queue.offer(msg)){
            update(publisher, msg);
        }
    }
    /**
    * @Description:  处理订阅
    * @Param: [subcriber]
    * @return: void
    * @Author: Henry
    */
    public void subcribe(SubcriberImp subcriber) {
        subcriberlist.add(subcriber);
    }
    /**
    * @Description:  处理取消订阅
    * @Param: [subcriber]
    * @return: void
    * @Author: Henry
    */
    public void unSubcribe(SubcriberImp subcriber) {
        subcriberlist.remove(subcriber);
    }
}
posted @ 2022-03-29 10:49  HENRYWHALE  阅读(120)  评论(0)    收藏  举报