美文网首页
手写简单Rxjava理解其内部实现(二)

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

作者: 进击de小黑 | 来源:发表于2021-09-28 10:53 被阅读0次

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

    • 创建一个用于数据转换接口
    interface Function<T, U> {
        //外部实现数据的转换逻辑
        fun apply(t: T): U
    }
    
    • 基于装饰者模式,我们抽象出观察者及被观察者装饰者接口
    //注意这里持有了一个ObservableSource被观察者对象
    abstract class AbstractObservableWithUpStream<T, U>(var observableSource: ObservableSource<T>) :
        Observable<U>() {
    
    }
    //同样持有了一个Observer观察者
    open class BasicFuseabObserver<T, U>(var oberver: Observer<U>) : Observer<T> {
        override fun onNext(t: T) {}
        override fun onSubscribe() {}
        override fun onComplete() {}
        override fun onError(t: Throwable) {}
    }
    
    • 实现装饰者类,传入了被装饰者对象
    //被观察者
    class ObservableMap<T, U>(observableSource: ObservableSource<T>, var mapper: Function<T, U>) :
        AbstractObservableWithUpStream<T, U>(observableSource) {
    
        override fun subscribeActual(observer: Observer<U>) {
              //调用持有的被观察者的subscribe,同时创建了装饰后的观察者对象
            observableSource.subscribe(MapObserver(observer, mapper))
        }
       //观察者
        class MapObserver<T, U>(observer: Observer<U>, var mapper: Function<T, U>) :
            BasicFuseabObserver<T, U>(observer) {
    
            override fun onNext(t: T) {
                //执行装饰逻辑及原被装饰者逻辑
                val apply = mapper.apply(t)
                oberver.onNext(apply)
            }
        }
    }
    
    • 下面我们在Observable里实现map操作符
        fun <U> map(mapper: Function<T, U>): Observable<U> {
             //注意这里传入的this对象,就是上游的Observable对象
            // 传给下游,利用装饰者模式,mapper进行数据转换
            return ObservableMap(this, mapper)
        }
        Observable.create(object : ObservableOnSubscribe<String> {
                override fun subscribe(emitter: Emitter<String>) {
                    emitter.onNext("HELLO")
                }
            }).map(object : Function<String, Int> {
                    override fun apply(t: String): Int {
                        return 1000
                    }
           }).subscribe(object : Observer<Int> {
                    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理解其内部实现(二)

          本文链接:https://www.haomeiwen.com/subject/yovlnltx.html