(4.6.22.3)来吧,是时候撸一份自己的RxJava框架啦:装饰器模式实现操作符顺序调用

操作符的原理: 适配器模式(装饰器模式)
3.1 数据结构链式结构的头插法,实现装饰器模式
3.2 头部调用

设计思路

装饰器模式,实现onObserver代理的通用集成,并持有上一个装换

图形实例

这里写图片描述

Publisher
.create()
.h1 // 创建observer类型的h1, header 和 last指针都指向该节点,h1.pre为null
.h2 // 创建observer类型的h2,h2.pre为null。设置h1.pre = h2, 同时 last后移
.h3// 创建observer类型的h3,h3.pre为null。设置h2.pre = h3, 同时 last后移
.bind(observerA)
.post();// 设置h3.pre = observerA, 并将header 传递给 生产者.call(header)方法中

此时,我们在call中调用 header.onSuccess(T)时,其实是 :

  • 先调用Pre=h1.Success{1. 完成h1的func1 2. 调用h1.Pre=h2.Success
    • {1. 完成h2的func1 2. 调用h2.Pre=h3.Success
      • {1. 完成h3的func1 2. 调用h3.Pre=onObserver.Success}}}

实践

1. 链式结构

1.1 抽象节点

/**
 * 【观察者---消费者: 事件的消费者】 的控制器代理: 变换类通用代理
 * 实现链式调用的数据结构
 * Created by yhf on 16/12/18.
 */
public abstract class Change<I,O> implements OnObserver<I>,IObserverProxy<O> {
    protected OnObserver<O> preChange; // 上个变换实例---指向上一个指针
    protected Func1 changeImpl; // 转换代理 实例
    protected IObserverProxy iObserverProxy;// 被代理的观察者们的 【实际】控制器代理
    public Change(OnObserver<I> preChange) {
        this.preChange = (OnObserver<O>) preChange;
        iObserverProxy = (IObserverProxy<I>) preChange;
    }
    public Change() {
    }

    /**
     * 调用 【实际 【观察者---消费者: 事件的消费者】】控制器 代理   向观察者容器中,增删查
     *
     */
    @Override
    public void addObserver(OnObserver observer) {
        iObserverProxy.addObserver(observer);
    }

    @Override
    public void rmObserver(OnObserver observer) {
        iObserverProxy.addObserver(observer);
    }

    @Override
    public void clear() {
        iObserverProxy.clear();
    }

    @Override
    public Vector<OnObserver<O>> getObservers() {
        return iObserverProxy.getObservers();
    }

    /**
     * //调用 preChange 代理
     */
    @Override
    public void onError(Throwable throwable) {
        preChange.onError(throwable);
    }

    @Override
    public void onFinished() {
        preChange.onFinished();
    }


    /**
     * 完成链式结构
     * @param preChange
     */
    public void setPreChange(OnObserver<I> preChange){
        this.preChange = (OnObserver<O>) preChange;
        iObserverProxy = (IObserverProxy<I>) preChange;
    }

    public void setChangeImpl(Func1 changeImpl) {
        this.changeImpl = changeImpl;
    }
}
1.1.1 过滤操作的 链表节点

我们可以看到,它是先调用 自身的 过滤实例函数,如果成功了,才会调用前一个的

/**
 * 【观察者---消费者: 事件的消费者】 的控制器代理: 过滤类同用代理
 * 链式的数据结构的具体节点
 * Created by yhf on 16/12/18.
 */
public class FilterChange<T> extends Change<T,T>{

    /**
     * //唯一  没有直接使用  实际代理控制器的地方
     // !!! 根据preChange代理mapProxy.call(t)的返回值,作为参数,调用onSucces
     * @param t
     */
    @Override
    public void onSuccess(T t) {
        if ((Boolean) changeImpl.call(t))
            preChange.onSuccess(t);
    }
}
1.1.2 map 数据转换操作的 链表节点
/**
 * 【观察者---消费者: 事件的消费者】 的控制器代理: 变换类同用代理
 * 链式的数据结构的具体节点
 * Created by yhf on 16/12/18.
 */
public class MapChange<I,O> extends Change<I,O>{

    /**
     * //唯一  没有直接使用  实际代理控制器的地方
     // !!! 根据preChange代理mapProxy.call(t)的返回值,作为参数,调用onSucces
     * @param i
     */
    @Override
    public void onSuccess(I i) {
        preChange.onSuccess((O) changeImpl.call(i));
    }
}

2. 图形实例的实现过程

    private Change changeHead;
    private Change changeLast;
        private Publisher() {
        ...
        changeHead = new Change() {
            @Override
            public void onSuccess(Object o) {
                preChange.onSuccess(o);
            }
        };
        changeLast = changeHead;
        ...
    }

    /**
     * 实现链式的顺序调用方式,就是图示的h1.2.3操作
     * 每个变换代理中持有上个变换代理实例,调用上个变换代理的变换函数
     *   h1------pre----> h2------pre----->h3
     *  head                              Last
     *  其实就是 数据结构的链式结构,尾插法
     * @param change  变换的实例对象
     * @param changeProxy 变换的通用代理
     * @param <I>
     * @param <O>
     * @return
     */
    @Override
    public <I, O> IPublisher<T> change(Func1<I, O> change, Change changeProxy) {
        changeProxy.setChangeImpl(change);// 设置节点的自身操作函数
        changeLast.setPreChange(changeProxy); // 设置节点前驱
        changeLast = changeProxy; // last指针后移
        return this;
    }


    @Override
    public Future post() {
        /**
             *  h1------pre----> h2------pre----->h3---->onObserver
             *  head                              Last
             *  其实就是 数据结构的链式结构,尾插法
             */
            changeLast.setPreChange(onObserver);
        /**
         *  h1------pre----> h2------pre----->h3---->onObserver
         *  head                              Last
         *  调用changeHead.onSuccess的过程就是:
         *  先调用Pre=h1.Success{1. 完成h1的func1 2. 调用h1.Pre=h2.Success
         *                                                        {1. 完成h2的func1 2. 调用h2.Pre=h3.Success
         *                                                                                              {1. 完成h3的func1 2. 调用h3.Pre=onObserver.Success}}}
         */
        onPublisher.call(changeHead); // 注入 消费者们的代理类
        OnPublisherProxy proxy = (OnPublisherProxy) onPublisher;
        return proxy.getFuture();
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值