java中装饰器_Java装饰器模式(Decorator)

public abstract class Cake {

// Cake是个抽象类,扮演的是抽象构件(Component)角色,它已经实现了

// getRemark的方法,但没有实现getImpression,必须被子类实现。

String remark = "蛋糕";

public String getRemark() {

return remark;

}

// 用来描述吃蛋糕的感觉

public abstract String getImpression();

}

public abstract class Decorator extends Cake {

Cake cake;

// 引用一个Cake,让被装饰者进入装饰者之中;

// 这里用的是构造方法注入,这样就可以调用Cake实例的方法了。

public Decorator(Cake cake) {

this.cake = cake;

}

// 让装饰器的子类都去实现getRemark方法,业务需要每个装饰器都要有描述。

public abstract String getRemark();

}

public class CheeseCake extends Cake {

// 乳酪蛋糕的构造方法,修改乳酪蛋糕的描述。

public CheeseCake() {

super.remark = "乳酪蛋糕";

}

// 实现了Cake抽象类的getImpression吃乳酪蛋糕的感觉。。

public String getImpression() {

return "乳酪蛋糕,香甜感受";

}

}

public class IceCake extends Cake {

// 冰淇淋蛋糕的构造方法,修改冰淇淋蛋糕的描述。

public IceCake() {

super.remark = "冰淇淋蛋糕";

}

// 实现了Cake抽象类的getImpression吃冰淇淋蛋糕的感觉。。

public String getImpression() {

return "冰凉的感受很好";

}

}

public class FlowerDecorator extends Decorator {

// 传入一个cake实例,也就是前面所实现的Cake的子类,如奶酪蛋糕,巧克力蛋糕等等。

public FlowerDecorator(Cake cake) {

// 调用父类的构造方法,可以获取Cake的实例了。就可以调用Cake实例的方法

super(cake);

super.remark = "一朵玫瑰花";

}

@Override

public String getRemark() {

return cake.getRemark() + "+" + super.remark;

}

// 实现了装饰器抽象类的getImpression方法。

// 这是重点。我们通过构造方法传入的cake实例。对cake进行了装饰,增加了新的功能。

@Override

public String getImpression() {

return super.cake.getImpression() + "," + "看到一朵花真是happy";

}

}

public class NutsDecorator extends Decorator {

// 传入一个cake实例,也就是前面所实现的Cake的子类

public NutsDecorator(Cake cake) {

// 调用父类的构造方法,可以获取Cake的实例了。就可以调用Cake实例的方法

super(cake);

super.remark = "一颗果仁";

}

@Override

public String getRemark() {

return cake.getRemark() + "+" + super.remark;

}

// 实现了装饰器抽象类的getImpression方法。

// 这是重点。我们通过构造方法传入的cake实例,对cake进行了装饰,增加了新的功能。

@Override

public String getImpression() {

return super.cake.getImpression() + "," + "看到一顆果仁,哈哈";

}

}

public class Client {

public static void main(String[] args) {

// 用果仁,花包装乳酪蛋糕。

Cake nutsFlowerChocolateCake = new NutsDecorator(new FlowerDecorator(

new CheeseCake()));

System.out.println("remark:" + nutsFlowerChocolateCake.getRemark());

// 吃蛋糕的感受已经发生了改变。

System.out.println("impression:"

+ nutsFlowerChocolateCake.getImpression());

}

}

remark:乳酪蛋糕+一朵玫瑰花+一颗果仁

impression:乳酪蛋糕,香甜感受,看到一朵花真是happy,看到一顆果仁,哈哈

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值