java中装饰器"/>
java中装饰器
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,看到一顆果仁,哈哈
更多推荐
java中装饰器
发布评论