├── EasyReactive.iml ├── README.md ├── src └── com │ └── er │ ├── Observer.java │ ├── Subject.java │ ├── Subscriber.java │ ├── Subscrition.java │ ├── functions │ ├── Action1.java │ ├── Function.java │ └── Function1.java │ └── operators │ ├── OperatorFilter.java │ └── OperatorMap.java └── test └── com └── er └── OperatorTest.java /EasyReactive.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # EasyReactive 2 | 极简的响应式编程框架,通过该框架你可以快速理解响应式编程的方法,以及如何自行构建响应式框架。 3 | 该框架在observer pattern的基础上实现,通过该框架你可以大体地了解响应式框架的一些设计策略,在此基础上你可以自行扩展练习。 4 | 5 | -------------------------------------------------------------------------------- /src/com/er/Observer.java: -------------------------------------------------------------------------------- 1 | package com.er; 2 | 3 | public interface Observer { 4 | public void onNext(T state); 5 | } 6 | -------------------------------------------------------------------------------- /src/com/er/Subject.java: -------------------------------------------------------------------------------- 1 | package com.er; 2 | 3 | 4 | import com.er.functions.Action1; 5 | import com.er.functions.Function1; 6 | import com.er.operators.OperatorFilter; 7 | import com.er.operators.OperatorMap; 8 | 9 | /** 10 | * Created by God on 2016/1/22. 11 | */ 12 | public class Subject { 13 | 14 | private OnSubscible onSubscible; 15 | 16 | public Subject(OnSubscible f) { 17 | this.onSubscible = f; 18 | } 19 | 20 | public static Subject create(OnSubscible onSubscible) { 21 | return new Subject(onSubscible); 22 | 23 | } 24 | 25 | public void subscribe(Subscriber subscribler) { 26 | if (subscribler == null) { 27 | throw new NullPointerException("Observer can not be null"); 28 | } else if (this.onSubscible == null) { 29 | throw new IllegalArgumentException("onSubscribe function can not be null."); 30 | } else { 31 | this.onSubscible.call(subscribler); 32 | } 33 | 34 | } 35 | 36 | 37 | public Subject filter(Function1 function) { 38 | 39 | return lift(new OperatorFilter(function)); 40 | } 41 | 42 | 43 | public Subject map(Function1 function) { 44 | return lift(new OperatorMap(function)); 45 | } 46 | 47 | private Subject lift(Operator operator) { 48 | return new Subject<>(new OnSubscible() { 49 | @Override 50 | public void call(Subscriber o) { 51 | Subscriber e = operator.call(o); 52 | Subject.this.onSubscible.call(e);//上一个Subject引用的onSubscibe 53 | 54 | } 55 | }); 56 | } 57 | 58 | public interface OnSubscible extends Action1> { 59 | } 60 | 61 | public interface Operator extends Function1, Subscriber> { 62 | } 63 | 64 | } 65 | -------------------------------------------------------------------------------- /src/com/er/Subscriber.java: -------------------------------------------------------------------------------- 1 | package com.er; 2 | 3 | /** 4 | * Created by God on 2016/1/26. 5 | */ 6 | public abstract class Subscriber implements Observer, Subscrition { 7 | private Subscriber subscriber; 8 | 9 | public Subscriber(Subscriber subscriber) { 10 | this.subscriber = subscriber; 11 | } 12 | 13 | public Subscriber() { 14 | 15 | } 16 | 17 | @Override 18 | public void unSubscribe() { 19 | 20 | } 21 | 22 | @Override 23 | public boolean isUnSubscribed() { 24 | return false; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/com/er/Subscrition.java: -------------------------------------------------------------------------------- 1 | package com.er; 2 | 3 | /** 4 | * Created by God on 2016/1/26. 5 | */ 6 | public interface Subscrition { 7 | void unSubscribe(); 8 | boolean isUnSubscribed(); 9 | } 10 | -------------------------------------------------------------------------------- /src/com/er/functions/Action1.java: -------------------------------------------------------------------------------- 1 | package com.er.functions; 2 | 3 | /** 4 | * Created by God on 2016/1/26. 5 | */ 6 | @FunctionalInterface 7 | public interface Action1 extends Function{ 8 | void call(T var); 9 | } 10 | -------------------------------------------------------------------------------- /src/com/er/functions/Function.java: -------------------------------------------------------------------------------- 1 | package com.er.functions; 2 | 3 | /** 4 | * Created by God on 2016/1/29. 5 | */ 6 | public interface Function { 7 | } 8 | -------------------------------------------------------------------------------- /src/com/er/functions/Function1.java: -------------------------------------------------------------------------------- 1 | package com.er.functions; 2 | 3 | /** 4 | * Created by God on 2016/1/26. 5 | */ 6 | @FunctionalInterface 7 | public interface Function1 extends Function{ 8 | R call(T var); 9 | } 10 | -------------------------------------------------------------------------------- /src/com/er/operators/OperatorFilter.java: -------------------------------------------------------------------------------- 1 | package com.er.operators; 2 | 3 | 4 | import com.er.Subject; 5 | import com.er.Subscriber; 6 | import com.er.functions.Function1; 7 | 8 | /** 9 | * Created by God on 2016/1/27. 10 | */ 11 | public class OperatorFilter implements Subject.Operator { 12 | Function1 function; 13 | 14 | public OperatorFilter(Function1 function) { 15 | this.function = function; 16 | } 17 | 18 | public Subscriber call(Subscriber var) { 19 | return new Subscriber(var) { 20 | @Override 21 | public void onNext(T state) { 22 | 23 | if (OperatorFilter.this.function.call(state).booleanValue()) { 24 | var.onNext(state); 25 | } 26 | } 27 | }; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/com/er/operators/OperatorMap.java: -------------------------------------------------------------------------------- 1 | package com.er.operators; 2 | 3 | 4 | import com.er.Subject; 5 | import com.er.Subscriber; 6 | import com.er.functions.Function1; 7 | 8 | /** 9 | * Created by God on 2016/1/26. 10 | * operator 11 | */ 12 | public class OperatorMap implements Subject.Operator { 13 | private Function1 convert; 14 | 15 | public OperatorMap(Function1 convert) { 16 | this.convert = convert; 17 | } 18 | 19 | 20 | public Subscriber call(Subscriber o) { 21 | 22 | return new Subscriber(o) { 23 | @Override 24 | public void onNext(T state) { 25 | 26 | o.onNext(OperatorMap.this.convert.call(state)); 27 | 28 | } 29 | }; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /test/com/er/OperatorTest.java: -------------------------------------------------------------------------------- 1 | package com.er; 2 | 3 | 4 | import com.er.functions.Function1; 5 | import org.junit.Test; 6 | 7 | /** 8 | * Created by God on 2016/1/22. 9 | * operator test 10 | */ 11 | public class OperatorTest { 12 | 13 | 14 | @Test 15 | public void filterTest() { 16 | Subject subject = Subject.create(new Subject.OnSubscible() { 17 | @Override 18 | public void call(Subscriber var) { 19 | var.onNext(""); 20 | } 21 | }); 22 | 23 | 24 | Subject newSubject = subject.map(var -> var + "_map"); 25 | 26 | Subject threeSubject = newSubject.filter((Function1) var -> var.length() > 10); 27 | 28 | 29 | threeSubject.subscribe(new Subscriber() { 30 | @Override 31 | public void onNext(String state) { 32 | System.out.println(state); 33 | } 34 | }); 35 | } 36 | 37 | //map操作测试 38 | @Test 39 | public void mapTest() { 40 | Subject subject = Subject.create(new Subject.OnSubscible() { 41 | @Override 42 | public void call(Subscriber var) { 43 | var.onNext("ok"); 44 | } 45 | }); 46 | 47 | 48 | Subject newSubject = subject.map(var -> var + "_map"); 49 | 50 | Subject threeSubject = newSubject.map(var -> var + "|||||||||||"); 51 | 52 | 53 | threeSubject.subscribe(new Subscriber() { 54 | @Override 55 | public void onNext(String state) { 56 | System.out.println(state); 57 | } 58 | }); 59 | } 60 | 61 | @Test 62 | public void createTest() { 63 | Subject.create(new Subject.OnSubscible() { 64 | @Override 65 | public void call(Subscriber var) { 66 | var.onNext("ok"); 67 | } 68 | }).subscribe(new Subscriber() { 69 | @Override 70 | public void onNext(String state) { 71 | System.out.println(state + "===="); 72 | } 73 | }); 74 | } 75 | } 76 | --------------------------------------------------------------------------------