装饰模式:
动态的将责任附加到对象上
对于扩展性而言,装饰模式比继承更具有弹性,因为装饰模式利用组合关系
关键地方:
让装饰者与被装饰者实现同一个接口,或者继承同一个抽象类,目的是为了让它们具有统一的类型
类型统一了,方法就可以接收所有的子类型,然后在运行时动态绑定到具体的子类对象上
===》接口:让装饰者与被装饰者具有统一的类型
package pattern.decorator; public interface Food { String description(); double cost(); }
package pattern.decorator; public abstract class AbstractFood implements Food { protected String description = "未知食物"; public String description() { return description + "(" + cost() + ")"; } }
===》被装饰者
扫描二维码关注公众号,回复:
1165668 查看本文章
package pattern.decorator; public class Noodle extends AbstractFood { public Noodle() { this.description = "面条"; } public double cost() { return 5.00; } }
package pattern.decorator; public class Dumpling extends AbstractFood { public Dumpling() { this.description = "饺子"; } public double cost() { return 8.00; } }
===》装饰者
package pattern.decorator; public class Cayenne implements Food { Food food; public Cayenne(Food food) { this.food = food; } public double cost() { return food.cost() + extraFee(); } private double extraFee() { return 1.00; } public String description() { return food.description() + " + 辣椒(" + extraFee() + ")"; } }
package pattern.decorator; public class Parsley implements Food { Food food; public Parsley(Food food) { this.food = food; } public String description() { return food.description() + " + 香菜(" + extraFee() + ")"; } public double cost() { return food.cost() + extraFee(); } private double extraFee() { return 0.50; } }
===》测试
package pattern.decorator; import java.text.NumberFormat; public class Test { public static void main(String[] args) { Food food = new Noodle(); food = new Cayenne(food);//装饰 food = new Parsley(food);//装饰 food = new Parsley(food);//再装饰 String desc = food.description(); System.out.println(desc); double total = food.cost(); String cost = NumberFormat.getCurrencyInstance().format(total); System.out.println(cost); } }
面条(5.0) + 辣椒(1.0) + 香菜(0.5) + 香菜(0.5)
¥7.00