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

2021-06-27  本文已影响0人  蓝笔头

介绍

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

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

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

ObservableCreate

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

public abstract class Observable<T> {

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

    protected abstract void subscribeActual(Observer<T> observer);

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

public class ObservableCreate<T> extends Observable<T>{
    private ObservableOnSubscribe<T> source;

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

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

实现 ObservableMap

package org.company.rxjava.pattern;

import java.util.function.Function;

public class ObservableMap<U, D> extends Observable<D> {
    private Observable<U> upstream;
    private Function<U, D> mapper;

    public ObservableMap(Observable<U> upstream, Function<U, D> mapper) {
        this.upstream = upstream;
        this.mapper = mapper;
    }

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

    public static class MapObserver<U, D> implements Observer<U> {
        private Observer<D> downstream;
        private Function<U, D> mapper;

        public MapObserver(Observer<D> downstream, Function<U, D> 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 <R> Observable<R> map(Function<T, R> mapper) {
        return new ObservableMap<>(this, mapper);
    }

测试代码:

@Slf4j
public class Main {

    public static void main(String[] args) {
        Observable.create(new ObservableOnSubscribe<Integer>() {
                    @Override
                    public void subscribe(Emitter<Integer> 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<Integer>() {
                    @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 职责和数据流向如下图所示:

参考

上一篇 下一篇

猜你喜欢

热点阅读