RxJava

RxJava 源码学习手写框架二 (前传) - 装饰者模式

2020-10-14  本文已影响0人  tingtingtina

在上一篇,我们从观察者模式起搭建了一个RxJava 的框架。
在继续撸码之前,介绍下装饰器模式。



对装饰器模式的说明大概是这样的

啥意思呢
就像去买一个鸡蛋灌饼,可以加生菜,加里脊,加烤肠最后结账,看看 how much

假如我要买个灌饼 + 里脊,可以创建一个CakeA
如果要加个烤肠呢,再创建一个 CakeB?也行。
那既加里脊又加烤肠呢 #¥%……&*

一个灌饼的价格怎么算的呢
一个标配的灌饼 5元,加烤肠 +2,加里脊 +3,这种需要扩展对象一些职责或者功能,就可以使用装饰者模式。

Component --- > 定义一个灌饼 Pizza(为了对应 UML 表示),里面有个计算价格的方法
ConcreteComponent --> 标配的灌饼,有基本价格是 5块
Decorator --> 装饰器,有对灌饼的引用
ConcreteDecoratorA --> 烤肠,价格 + 2
ConcreteDecoratorB --> 里脊,价格 + 3

先定义一个 灌饼,有两个方法吧,一个是名称一个是价格。

public interface Pizza {
   String getName();
   int getPrice();
}

一个标配的灌饼 BasePizza,实现 Pizza,一个标配 5元

public class BasePizza implements Pizza {

    public String getName() {
        return "BasePizza";
    }

    public int getPrice() {
        return 5;
    }
}

然后给这个饼加料,加料前先把他们归为“料”,来个装饰器

public class Decorator implements Pizza {
    Pizza pizza;

    public Decorator(Pizza pizza) {
        this.pizza = pizza;
    }

    @Override
    public String getName() {
        return pizza.getName();
    }

    @Override
    public int getPrice() {
        return pizza.getPrice();
    }

    public void show() {
        System.out.println(getName() + " :" + getPrice());
    }
}

然后准备两个可以被加的 “配料” A是烤肠,B是里脊,分别补充单价 2 元 和 3 元

public class PizzaA extends Decorator {
    
    public PizzaA(Pizza pizza) {
        super(pizza);
    }

    @Override
    public int getPrice() {
        return pizza.getPrice() + 2;
    }

    @Override
    public String getName() {
        return super.getName() + " + 烤肠";
    }
}

public class PizzaB extends Decorator {

    public PizzaB(Pizza pizza) {
        super(pizza);
    }

    @Override
    public int getPrice() {
        return pizza.getPrice() + 3;
    }

    @Override
    public String getName() {
        return super.getName() + " + 里脊";
    }
}
  public void test() {
        Pizza pizza = new BasePizza();
        PizzaA pizzaA = new PizzaA(pizza);
        PizzaB pizzaB = new PizzaB(pizzaA);
        pizzaB.show();
    }
// 输出:BasePizza + 烤肠 + 里脊 :10

上面如果我要个只加烤肠的,输出 pizzaA 就可以了。如果只要里脊呢 new PizzaB(pizza); 是不是就可以了,就这么 easy。

为什么要提装饰器模式呢,因为 Rxjava 的操作符实现就用到了这个模式

上一篇 下一篇

猜你喜欢

热点阅读