核心设计
- 装饰者类:
- 引用基础类
- 继承基础类(实现基础类的接口)
类图
- 基础类是 Shape (基础接口)
- 装饰类通过同时实现基础类接口和引用基础类达到可以继续扩展的目的
- 原本通过 Shape 类可以画 Circle 和 Rectangle
- 装饰者类通过引用 Shape 达到了原有的目的,通过 实现 Shape 接口保持自己也具有和 Shape 同样的身份(属性),从而我们在程序中调用 ShapeDecorator 及其子类对象的时候,就可以通过 Shape 类型来接受他们;而不用涉及新的类
- 下面的例子是一个牛肉面的例子:
- 面是基类接口,主要有 regularNoodle 和 BeefNoodle 这两种面
- NoodlesDecorator 既实现了 Noodles 接口,又引用了 Noodles 对象;即,他可以在 noodles 本身基础上进行扩展
- NoodlesDecorator 本身是个抽象类,这就保证了他可以通过子类生成多种多样的 decorator,比如加鸡蛋的面,就是 EggNoodlesDecorator,在加鸡蛋的面里面既可以产出 “加鸡蛋的牛肉面” 也可以产出 “加鸡蛋的普通面”
代码
package 设计模式.装饰者模式;
public interface Noodles {
float cost();
String description();
}
package 设计模式.装饰者模式;
public class BeefNoodles implements Noodles {
private final float price = 30;
private String name = "beefNoodles";
@Override
public float cost() {
return price;
}
@Override
public String description() {
return name;
}
}
package 设计模式.装饰者模式;
public class RegularNoodles implements Noodles{
private final float price = 10;
private String name = "regularNoodles";
@Override
public float cost() {
return price;
}
@Override
public String description() {
return name;
}
}
package 设计模式.装饰者模式;
public abstract class NoodlesDecorator implements Noodles {
protected float price;
protected Noodles noodles;
@Override
public abstract float cost();
@Override
public abstract String description();
}
package 设计模式.装饰者模式;
public class EggNoodlesDecorator extends NoodlesDecorator {
private float eggPrice=3;
private String name = "egg";
public EggNoodlesDecorator(Noodles noodles){
this.noodles = noodles;
}
@Override
public float cost() {
return eggPrice + noodles.cost();
}
@Override
public String description() {
return name + noodles.description();
}
}
package 设计模式.装饰者模式;
import java.util.prefs.NodeChangeEvent;
public class Demo {
public static void main(String[] args) {
Noodles beef = new BeefNoodles();
System.out.println(beef.description());
Noodles eggbeef = new EggNoodlesDecorator(buf);
System.out.println(eggbeef.description());
}
}