装饰者模式
什么是装饰者模式
装饰者模式,以类似“装饰”的方式,动态地给对象添加功能。装饰者模式要求装饰对象和被装饰对象同时实现同一个接口,装饰对象持有被装饰对象实例。
使用场景
给一个对象添加新功能,要求可以动态添加动态撤销。相较于继承,不需要新建很多子类,而且可以按功能划分不同的装饰类,动态组合,而且对于多种不同的功能要求可以自由组合地情况,根据不同的情况创建不同的子类变得不切实际,这个时候就需要装饰者模式。
例子
接口:
public interface KfcPlatedMeals {
public String getName();
public float getPrice();
}
被装饰类
public class PlatedMeals implements KfcPlatedMeals {
private String name;
public PlatedMeals(String name) {
this.name = name;
}
public String getName() {
return this.name + ":";
}
public float getPrice() {
return 0;
}
}
装饰类
public class FrenchFries implements KfcPlatedMeals {
private KfcPlatedMeals platedMeals;
public FrenchFries(KfcPlatedMeals platedMeals) {
this.platedMeals = platedMeals;
}
public String getName() {
return platedMeals.getName() + " 薯条";
}
public float getPrice() {
return platedMeals.getPrice() + 11f;
}
}
public class Cola implements KfcPlatedMeals {
private KfcPlatedMeals platedMeals;
public Cola(KfcPlatedMeals platedMeals) {
this.platedMeals = platedMeals;
}
public String getName() {
return platedMeals.getName() + " 可乐";
}
public float getPrice() {
return platedMeals.getPrice() + 2.5f;
}
}
测试
public class KfcPlatedMealsTest extends TestCase {
public void testPlatedMeals() {
KfcPlatedMeals platedMealsA = new Cola(new FrenchFries(new PlatedMeals("套餐A")));
System.out.println(platedMealsA.getName() + " /价格:" + platedMealsA.getPrice());
}
}

浙公网安备 33010602011771号