Java设计模式–装饰者模式
装饰者模式主要用于为对象动态地添加功能。若要扩展功能,提供比继承更富有弹性的替代方案。
装饰者和具体组件均继承于组件。
装饰者和被装饰者必须是一样的类型,也就是有共同的超类,这是相当关键的地方。在这里,利用继承达到类型匹配,而不是利用继承获得行为。
组件
package com.exercise.exercise.designmode.decoratormode;
public interface Food {
public String description = "Food";
public double cost();
}
具体组件(被装饰者)
package com.exercise.exercise.designmode.decoratormode;
public class PanCake implements Food{
private double price = 6;
private String description = "PanCake";
public PanCake(){
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public double cost(){
return price;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
装饰者
package com.exercise.exercise.designmode.decoratormode;
public class CondimentDecorator implements Food {
public double cost() {
return 0;
}
}
装饰者具体类
package com.exercise.exercise.designmode.decoratormode;
public class Egg extends CondimentDecorator{
private double price = 1.5;
private String description = "Egg";
private Food food;
public Egg(Food food){
this.food = food;
}
public double getPrice() {
return price + food.cost();
}
public void setPrice(double price) {
this.price = price;
}
@Override
public double cost() {
return price + food.cost();
}
}
装饰者具体类
package com.exercise.exercise.designmode.decoratormode;
public class Sausage extends CondimentDecorator{
private double price = 2;
private Food food;
public Sausage(Food food){
this.food = food;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public double cost() {
return price + food.cost();
}
}
测试类
package com.exercise.exercise.designmode.decoratormode;
public class MyBreakFast {
public static void main(String[] args) {
Food food = new PanCake();
//加鸡蛋
food = new Egg(food);
System.out.println("---panCake + egg price : "+food.cost());
//加火腿
food = new Sausage(food);
System.out.println("---panCake + egg + sausage price : "+food.cost());
}
}
运行结果