리액터 패턴
interface Publisher<T> {
void subscribe(Subscriber<T> s);
}
class SimplePublisher implements Publisher<Integer> {
private int max;
public SimplePublisher(int max) {
this.max = max;
}
@Override
public void subscribe(Subscriber<Integer> s) {
s.onSubscribe(new SimpleSubscription(s, max));
}
}
interface Subscription {
void request(int n);
void cancel();
}
class SimpleSubscription implements Subscription {
private Subscriber<Integer> sub;
private int max;
private int next = 1;
public SimpleSubscription(Subscriber<Integer> sub, int max) {
this.sub = sub;
this.max = max;
}
@Override
public void request(int n) {
if (n > max) {
sub.onError(new RuntimeException("최대값(" + max + ") 초과"));
} else {
int loop = next + n;
for (; next < loop; next++) {
sub.onNext(next);
if (next == max) {
sub.onComplete();
break;
}
}
}
}
@Override
public void cancel() {
System.out.println("[cancel] 데이터 그만 보내");
}
}
interface Subscriber<T> {
void onSubscribe(Subscription s);
void onNext(T item);
void onError(Throwable t);
void onComplete();
Subscription upstream();
}
class SimpleSubscriber implements Subscriber<Integer> {
private Subscription s;
public Subscription upstream() {
return s;
}
@Override
public void onSubscribe(Subscription s) {
this.s = s;
}
@Override
public void onNext(Integer item) {
System.out.println("onNext : " + item);
}
@Override
public void onError(Throwable t) {
System.out.println("[onError] 에러발생! " + t.getMessage());
}
@Override
public void onComplete() {
System.out.println("[onComplete] 데이터 수신 완료");
}
}
public class App {
public static void main(String[] args) {
Publisher<Integer> pub = new SimplePublisher(10);
Subscriber<Integer> sub = new SimpleSubscriber();
pub.subscribe(sub);
Subscription s = sub.upstream();
s.request(3);
s.request(3);
s.request(3);
s.request(3);
s.request(3);
}
}