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);
}
}