美文网首页
RXjava学习之装饰者设计模式

RXjava学习之装饰者设计模式

作者: VerseWang | 来源:发表于2018-01-18 19:17 被阅读0次

  不知不觉就到了这个尴尬的年龄,25岁才本科毕业的我,说句扎心的话,毕业的好晚,毕业的好晚,毕业的好晚,重要的事情说三遍,从小学一年级开始就比别人大两岁(心累),以前一想到这,就不禁质问他们,为什么要比别人大两岁(┭┮﹏┭┮),毕业后看着年迈的父母,真的不能刺激他们了,毕竟他们生我,无私的把我抚养长大,已经很不容易了。历史已经是历史了,而我们能改变的只有未来,除非能时光穿梭

今天来学习装饰者设计模式

文章参考了鸿洋大神的文章:http://blog.csdn.net/lmj623565791/article/details/24269409

1.定义

若要扩展功能,装饰者提供了比集成更有弹性的替代方案,动态地将责任附加到对象上。

先简单描述下装饰者模式发挥作用的地方,当我们设计好了一个类,我们需要给这个类添加一些辅助的功能,并且不希望改变这个类的代码,这时候就是装饰者模式大展雄威的时候了。这里还体现了一个原则:类应该对扩展开放,对修改关闭。

说一个应用场景,我们每天都要吃饭(这不是废话吗(* ̄rǒ ̄)),那我吃的菜有哪些呢,哈哈,我最拿手的好菜,蒜苗炒肉,我最爱吃的鱼,什么红烧鲫鱼,清炖草鱼,阳干鱼,说得我都流口水了,红烧鸡翅也不错,糖醋排骨也可以,时不时的吃下基围虾改善下伙食,偶尔来一顿北方的羊蝎子,再喝点小酒,那日子~~美滋滋的,当然要多吃点蔬菜,比如我最爱吃的臭菜(我们老家的叫法,不知道外面叫什么(#.#)),菠菜啊,饭后再喝点汤,我的拿手好菜,西红柿蛋汤,早餐的时候自己做个手抓饼(怎么好像在做白日梦)。想吃的菜那么多,我想做一顿我最爱吃的菜,怎么实现代码的开闭原则呢,这个需求装饰者模式是在合适不过的了

2.UML图

UML

3.吃货走起

定义基类

public abstract class Food {

public abstract String food();

public void doSomeThing() {

    }
}

主食

public class StapleFood extends Food {

@Override
public String food() {
    return "米饭";
}

@Override
public void doSomeThing() {
    super.doSomeThing();
    }
}

红烧鸡翅

public class HongShaoJiChi extends Food {

private final Food food;

public HongShaoJiChi(Food food) {
    this.food = food;
}
@Override
public String food() {
    return food.food() + " + 红烧鸡翅";
}

@Override
public void doSomeThing() {
    super.doSomeThing();
    }
}

基围虾

public class JiWeiXia extends Food {

private final Food food;

public JiWeiXia(Food food) {
    this.food = food;
}

@Override
public String food() {
    return food.food() + " + 基围虾";
}

@Override
public void doSomeThing() {
    super.doSomeThing();
    }
}

清炖草鱼

public class QingDunFish extends Food {

private final Food food;

public QingDunFish(Food food) {
    this.food = food;
}
@Override
public String food() {
    return food.food() + " + 清炖草鱼";
}

@Override
public void doSomeThing() {
    super.doSomeThing();
    }
}

蒜苗炒肉

public class SuanMiaoChaoRou extends Food {

private final Food food;

public SuanMiaoChaoRou(Food food) {
    this.food = food;
}

@Override
public String food() {
    return food.food() + " + 蒜苗炒肉";
}

@Override
public void doSomeThing() {
    super.doSomeThing();
    }
}

臭菜

public class ChouCai extends Food {
private final Food food;

public ChouCai(Food food) {
    this.food = food;
}

@Override
public String food() {
    return food.food() + " + 臭菜";
    }
}

西红柿蛋汤

public class XiHongShiDanTang extends Food {

private final Food food;

public XiHongShiDanTang(Food food) {
    this.food = food;
}

@Override
public String food() {
    return food.food() + " + 西红柿蛋汤";
    }
}

这是菜谱,各位客官随便点吧

既然这么说,我可以全要吗,好滴客官~~

XiHongShiDanTang xiHongShiDanTang = new XiHongShiDanTang(new ChouCai(new HongShaoJiChi(new JiWeiXia(new QingDunFish(new SuanMiaoChaoRou(stapleFood))))));
            Log.d("wangyang", "   菜谱 = " + xiHongShiDanTang.food());

上菜啦

D/wangyang:    菜谱 = 米饭 + 蒜苗炒肉 + 清炖草鱼 + 基围虾 + 红烧鸡翅 + 臭菜 + 西红柿蛋汤

不行,做人不能太贪,得荤素搭配,小二,给我来个四菜一汤

好滴,客官

QingDunFish qingDunFish1 = new QingDunFish(new HongShaoJiChi(new ChouCai(new XiHongShiDanTang(stapleFood))));
Log.d("wangyang", "   菜谱 = " + qingDunFish1.food());

上菜啦,客官您当心点

    D/wangyang:    菜谱 = 米饭 + 西红柿蛋汤 + 臭菜 + 红烧鸡翅 + 清炖草鱼

是不是很简单,如果想要增加其他菜,重新写一个类即可,先写到这里,又学了一种设计模式!啦啦啦,李刚,你妈喊你回去吃饭啦。

相关文章

网友评论

      本文标题:RXjava学习之装饰者设计模式

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