手写简单Rxjava理解其内部实现(二)

上一篇我们实现了,观察订阅及发布功能。本篇实现操作符Map。

  • 创建一个用于数据转换接口
interface Function {
    //外部实现数据的转换逻辑
    fun apply(t: T): U
}
  • 基于装饰者模式,我们抽象出观察者及被观察者装饰者接口
//注意这里持有了一个ObservableSource被观察者对象
abstract class AbstractObservableWithUpStream(var observableSource: ObservableSource) :
    Observable() {

}
//同样持有了一个Observer观察者
open class BasicFuseabObserver(var oberver: Observer) : Observer {
    override fun onNext(t: T) {}
    override fun onSubscribe() {}
    override fun onComplete() {}
    override fun onError(t: Throwable) {}
}
  • 实现装饰者类,传入了被装饰者对象
//被观察者
class ObservableMap(observableSource: ObservableSource, var mapper: Function) :
    AbstractObservableWithUpStream(observableSource) {

    override fun subscribeActual(observer: Observer) {
          //调用持有的被观察者的subscribe,同时创建了装饰后的观察者对象
        observableSource.subscribe(MapObserver(observer, mapper))
    }
   //观察者
    class MapObserver(observer: Observer, var mapper: Function) :
        BasicFuseabObserver(observer) {

        override fun onNext(t: T) {
            //执行装饰逻辑及原被装饰者逻辑
            val apply = mapper.apply(t)
            oberver.onNext(apply)
        }
    }
}
  • 下面我们在Observable里实现map操作符
    fun  map(mapper: Function): Observable {
         //注意这里传入的this对象,就是上游的Observable对象
        // 传给下游,利用装饰者模式,mapper进行数据转换
        return ObservableMap(this, mapper)
    }
    Observable.create(object : ObservableOnSubscribe {
            override fun subscribe(emitter: Emitter) {
                emitter.onNext("HELLO")
            }
        }).map(object : Function {
                override fun apply(t: String): Int {
                    return 1000
                }
       }).subscribe(object : Observer {
                override fun onSubscribe() {
                    TODO("Not yet implemented")
                }

                override fun onNext(t: Int) {
                    TODO("Not yet implemented")
                }

                override fun onError(t: Throwable) {
                    TODO("Not yet implemented")
                }

                override fun onComplete() {
                    TODO("Not yet implemented")
                }
            })

这样我们就实现了数据的转换功能。同时我们可以发现,如果要实现新的操作符,只需要创建对应的观察者和被观察者的对应装饰类即可。

你可能感兴趣的:(手写简单Rxjava理解其内部实现(二))