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 的操作符实现就用到了这个模式