主类测试代码
package com.designpattern.pubsubpattern;
import com.designpattern.pubsubpattern.sub.Subscriber;
public class Main {
public static void main(String[] args) {
new CallBackFacade<String>(()-> {
return "helloworld";
}).then(new Subscriber<String>() {
@Override
public void onSuccess(String result) {
System.out.println("成功:" + result);
}
@Override
public void onFailure() {
System.out.println("失败");
}
}).then(new Subscriber() {
@Override
public void onSuccess(Object result) {
System.out.println("又成功了:" + result);
}
@Override
public void onFailure() {
System.out.println("又失败了");
}
}).ok();
}
}
对外的统一使用接口
package com.designpattern.pubsubpattern;
import com.designpattern.pubsubpattern.manager.Manager;
import com.designpattern.pubsubpattern.message.Message;
import com.designpattern.pubsubpattern.pub.Publisher;
import com.designpattern.pubsubpattern.sub.Subscriber;
import java.util.concurrent.*;
public class CallBackFacade<T> {
private int nThreads = 0;
private Manager manager;
private Publisher publisher;
private FutureTask<T> futureTask;
private ExecutorService executorService;
private CountDownLatch countDownLatch;
private CallBackFacade(){
}
public CallBackFacade(Callable<T> callable) {
manager = new Manager();
publisher = new Publisher(manager);
futureTask = new FutureTask<T>(callable);
executorService = Executors.newCachedThreadPool(Executors.defaultThreadFactory());
}
public CallBackFacade<T> then(Subscriber subscriber) {
subscriber.setManager(manager);
subscriber.subscribeTopic("hello");
nThreads ++;
executorService.execute(()->{
try {
T t = futureTask.get();
publisher.publish(new Message().setSuccess(true).setResult(t).setTopic("hello"));
} catch (Exception e) {
publisher.publish(new Message().setSuccess(false).setTopic("hello"));
}
countDownLatch.countDown();
});
return this;
}
public void ok() {
countDownLatch = new CountDownLatch(nThreads);
executorService.execute(futureTask);
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
executorService.shutdown();
}
}
}
发布的消息
package com.designpattern.pubsubpattern.message;
import java.util.Objects;
public class Message<Result> {
private Result result = null;
private boolean success = false;
private String topic = "";
public Message() {
result = null;
}
public Message(String topic, Result result) {
this.setSuccess(true).setResult(result).setTopic(topic);
}
public Message(String topic) {
this.setSuccess(false).setTopic(topic);
}
public boolean isSuccess() {
return success;
}
public Message<Result> setResult(Result result) {
this.result = result;
return this;
}
public Message<Result> setSuccess(boolean success) {
this.success = success;
return this;
}
public Message setTopic(String topic) {
this.topic = topic;
return this;
}
public Result getResult() {
return result;
}
public String getTopic() {
return topic;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Message<?> message = (Message<?>) o;
return success == message.success && Objects.equals(result, message.result) && Objects.equals(topic, message.topic);
}
@Override
public int hashCode() {
return Objects.hash(result, success, topic);
}
}
管理者(订阅者的注册和发现中心)
package com.designpattern.pubsubpattern.manager;
import com.designpattern.pubsubpattern.message.Message;
import com.designpattern.pubsubpattern.sub.Subscriber;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
public class Manager {
private HashMap<String, Set<Subscriber>> messageSetHashMap = new HashMap<>();
public void addSubscriber(String topic, Subscriber subscriber) {
if (topic == null || subscriber == null) {
throw new NullPointerException("空指针异常了吧!");
}
if (!messageSetHashMap.containsKey(topic)) {
messageSetHashMap.put(topic, new HashSet<>());
}
messageSetHashMap.get(topic).add(subscriber);
}
public void removeSubscriber(String topic, Subscriber subscriber) {
if (messageSetHashMap.containsKey(topic)) {
messageSetHashMap.get(topic).remove(subscriber);
}
}
public void publish(Message message) {
Set<Subscriber> subscriberSet = messageSetHashMap.get(message.getTopic());
for (Subscriber subscriber : subscriberSet) {
if (message.isSuccess()) {
subscriber.onSuccess(message.getResult());
} else {
subscriber.onFailure();
}
}
}
}
发布者
package com.designpattern.pubsubpattern.pub;
import com.designpattern.pubsubpattern.manager.Manager;
import com.designpattern.pubsubpattern.message.Message;
public class Publisher {
private Manager manager;
public Publisher() { }
public Publisher(Manager manager) {
this.manager = manager;
}
public void publish(Message message) {
manager.publish(message);
}
}
订阅者抽象类
package com.designpattern.pubsubpattern.sub;
import com.designpattern.pubsubpattern.manager.Manager;
public abstract class Subscriber<T> {
protected Manager manager;
public Subscriber() { }
public Subscriber(Manager manager) {
this.manager = manager;
}
public void setManager(Manager manager) {
this.manager = manager;
}
public void subscribeTopic(String topic) {
manager.addSubscriber(topic, this);
}
public void unsubscribeTopic(String topic) {
manager.removeSubscriber(topic, this);
}
public abstract void onSuccess(T result);
public abstract void onFailure();
}