不知不觉就到了这个尴尬的年龄,25岁才本科毕业的我,说句扎心的话,毕业的好晚,毕业的好晚,毕业的好晚,重要的事情说三遍,从小学一年级开始就比别人大两岁(心累),以前一想到这,就不禁质问他们,为什么要比别人大两岁(┭┮﹏┭┮),毕业后看着年迈的父母,真的不能刺激他们了,毕竟他们生我,无私的把我抚养长大,已经很不容易了。历史已经是历史了,而我们能改变的只有未来,除非能时光穿梭
今天来学习装饰者设计模式
文章参考了鸿洋大神的文章:http://blog.csdn.net/lmj623565791/article/details/24269409
1.定义
若要扩展功能,装饰者提供了比集成更有弹性的替代方案,动态地将责任附加到对象上。
先简单描述下装饰者模式发挥作用的地方,当我们设计好了一个类,我们需要给这个类添加一些辅助的功能,并且不希望改变这个类的代码,这时候就是装饰者模式大展雄威的时候了。这里还体现了一个原则:类应该对扩展开放,对修改关闭。
说一个应用场景,我们每天都要吃饭(这不是废话吗(* ̄rǒ ̄)),那我吃的菜有哪些呢,哈哈,我最拿手的好菜,蒜苗炒肉,我最爱吃的鱼,什么红烧鲫鱼,清炖草鱼,阳干鱼,说得我都流口水了,红烧鸡翅也不错,糖醋排骨也可以,时不时的吃下基围虾改善下伙食,偶尔来一顿北方的羊蝎子,再喝点小酒,那日子~~美滋滋的,当然要多吃点蔬菜,比如我最爱吃的臭菜(我们老家的叫法,不知道外面叫什么(#.#)),菠菜啊,饭后再喝点汤,我的拿手好菜,西红柿蛋汤,早餐的时候自己做个手抓饼(怎么好像在做白日梦)。想吃的菜那么多,我想做一顿我最爱吃的菜,怎么实现代码的开闭原则呢,这个需求装饰者模式是在合适不过的了
2.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: 菜谱 = 米饭 + 西红柿蛋汤 + 臭菜 + 红烧鸡翅 + 清炖草鱼
是不是很简单,如果想要增加其他菜,重新写一个类即可,先写到这里,又学了一种设计模式!啦啦啦,李刚,你妈喊你回去吃饭啦。
网友评论