RxJava 中的设计模式(二)装饰器模式

时间:2021-7-3 作者:qvyue

介绍

装饰器模式(Decorator Pattern)又叫包装模式(Wrapper Pattern),允许向一个现有的对象添加新的功能,同时又不改变其结构。

这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

ObservableCreate

将 RxJava 中的设计模式(一)观察者模式 一文中的 Observable 调整为下面的结构。

public abstract class Observable {

    public static  Observable create(ObservableOnSubscribe source) {
        return new ObservableCreate(source);
    }

    protected abstract void subscribeActual(Observer observer);

    public void subscribe(Observer observer) {
        if (observer == null) {
            throw new IllegalArgumentException("observer must not be null");
        }
        subscribeActual(observer);
    }
}

public class ObservableCreate extends Observable{
    private ObservableOnSubscribe source;

    public ObservableCreate(ObservableOnSubscribe source) {
        this.source = source;
    }

    @Override
    protected void subscribeActual(Observer observer) {
        Emitter emitter = new Emitter(observer);
        this.source.subscribe(emitter);
    }
}

实现 ObservableMap

package org.company.rxjava.pattern;

import java.util.function.Function;

public class ObservableMap extends Observable {
    private Observable upstream;
    private Function mapper;

    public ObservableMap(Observable upstream, Function mapper) {
        this.upstream = upstream;
        this.mapper = mapper;
    }

    @Override
    protected void subscribeActual(Observer observer) {
        MapObserver mapObserver = new MapObserver(observer, this.mapper);
        this.upstream.subscribe(mapObserver);
    }

    public static class MapObserver implements Observer {
        private Observer downstream;
        private Function mapper;

        public MapObserver(Observer downstream, Function mapper) {
            this.downstream = downstream;
            this.mapper = mapper;
        }

        @Override
        public void onNext(U r) {
            D value = this.mapper.apply(r);
            this.downstream.onNext(value);
        }
    }
}

在 Observable 中添加如下方法:

    public final  Observable map(Function mapper) {
        return new ObservableMap(this, mapper);
    }

测试代码:

@Slf4j
public class Main {

    public static void main(String[] args) {
        Observable.create(new ObservableOnSubscribe() {
                    @Override
                    public void subscribe(Emitter emitter) {
                        emitter.onNext(1);
                        emitter.onNext(2);
                        emitter.onNext(3);
                    }
                })
                .map(v -> v + 10) // 11 12 13
                .map(v -> v * 2) // 22 24 26
                .subscribe(new Observer() {
                    @Override
                    public void onNext(Integer o) {
                        log.info("onNext {}", o);
                    }
                });
    }
}

输出:

11:26:14.547 [main] INFO org.company.rxjava.pattern.Main - onNext 22
11:26:14.557 [main] INFO org.company.rxjava.pattern.Main - onNext 24
11:26:14.557 [main] INFO org.company.rxjava.pattern.Main - onNext 26

ObservableCreateObservableMap 职责和数据流向如下图所示:

RxJava 中的设计模式(二)装饰器模式

参考

  • RxJava So Easy! 带你从0手撸一个RxJava
  • Rxjava中的设计模式
  • RxJava 源码学习手写框架二 (前传) – 装饰者模式
  • 装饰器模式
声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:qvyue@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。