微信关注公众号 JavaStorm 获取最新内容。java
装饰器模式(Decorator),动态地给一个对象添加一些额外的职责,就增长功能来讲,装饰器模式比生成子类更为灵活;它容许向一个现有的对象添加新的功能,同时又不改变其结构。==装饰器模式属于结构型模式==。git
如今有一个场景:煎饼果子,科技园上班族早上去买煎饼果子(Pancake),有的人要加鸡蛋 (Egg)、有的人加火腿 (Ham)、有的人加生菜 (Lettuce)。有的土豪煎饼果子来一套全都要。如今咱们来定义煎饼烹饪实现。(ps:留一个功能读者本身实现:不一样的套餐价格是不同的,如何计算出不一样煎饼果子的价格?有兴趣的读者能够留言或者微信公众号后台留言)。github
代码能够左右滑动bash
package com.zero.headfirst.decorator;
public interface Pancake {
/** * 烹饪方法 */
void cook();
}
复制代码
package com.zero.headfirst.decorator;
/** * 被装饰对象:定义最基本的乞丐版煎饼,啥都没加 */
public class BeggarPancake implements Pancake {
@Override
public void cook() {
System.out.println("乞丐版基本煎饼");
}
}
复制代码
package com.zero.headfirst.decorator;
/** * 抽象装饰器角色,实现煎饼接口(被装饰器接口),持有被装饰器的引用将烹饪行为转发具体的装饰器。 */
public abstract class PancakeDecorator implements Pancake {
private Pancake pancake;
public PancakeDecorator(Pancake pancake) {
this.pancake = pancake;
}
@Override
public void cook() {
if (pancake != null) {
pancake.cook();
}
}
}
复制代码
EggDecorator 鸡蛋装饰器:继承 PancakeDecorator,重写 cook 方法。动态添加鸡蛋,而后调用pancake 的cook。微信
package com.zero.headfirst.decorator;
/** * 鸡蛋装饰器:覆盖cook方法,加入自身的实现,而且调用父类的cook方法,也就是构造函数中 * EggDecorator(Pancake pancake),这里传入的pancake的cook操做 */
public class EggDecorator extends PancakeDecorator {
public EggDecorator(Pancake pancake) {
super(pancake);
}
@Override
public void cook() {
System.out.println("加一个鸡蛋;");
super.cook();
}
}
复制代码
火腿装饰器: HamDecoratoride
package com.zero.headfirst.decorator;
/** * 火腿装饰器 */
public class HamDecorator extends PancakeDecorator {
public HamDecorator(Pancake pancake) {
super(pancake);
}
@Override
public void cook() {
System.out.println("加一个火腿;");
super.cook();
}
}
复制代码
生菜装饰器函数
package com.zero.headfirst.decorator;
/** * 生菜装饰器 */
public class LettuceDecorator extends PancakeDecorator {
public LettuceDecorator(Pancake pancake) {
super(pancake);
}
@Override
public void cook() {
System.out.println("加生菜;");
super.cook();
}
}
复制代码
package com.zero.headfirst.decorator;
/** * 煎饼果子店 */
public class PancakeShop {
public static void main(String[] args) {
System.out.println("========土豪来了,全都加上。======");
BeggarPancake beggarPancake = new BeggarPancake();
EggDecorator eggDecorator = new EggDecorator(beggarPancake);
HamDecorator hamAndEggDecorator = new HamDecorator(eggDecorator);
LettuceDecorator lettuceAndHamAndEggDecorator = new LettuceDecorator(hamAndEggDecorator);
lettuceAndHamAndEggDecorator.cook();
System.out.println("========苦逼码农来了,只要鸡蛋补补脑。=====");
BeggarPancake beggarPancake1 = new BeggarPancake();
EggDecorator eggDecorator1 = new EggDecorator(beggarPancake1);
eggDecorator1.cook();
}
}
复制代码
========土豪来了,全都加上。======
加生菜;
加一个火腿;
加一个鸡蛋;
乞丐版基本煎饼
========苦逼码农来了,只要鸡蛋补补脑。=====
加一个鸡蛋;
乞丐版基本煎饼
复制代码
真实世界的装饰: Java I/O。 注意事项与要点this
拓展一个类的功能。spa
动态的添加与撤销职责。code
以上代码可参考个人 GitHub : github.com/UniqueDong/… JavaStorm 获取最新文章,也可在后台留言提出意见。收藏与关注是最大的鼓励。