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

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

作者: tingtingtina | 来源:发表于2020-10-14 13:18 被阅读0次

    在上一篇,我们从观察者模式起搭建了一个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 的操作符实现就用到了这个模式

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/vrdxuktx.html