装饰者模式是指在不改变原有对象的基础上,将功能附加到对象上,提供了比继承更有弹性的替代方案。
装饰者模式
下面我们来用厨房作为例子,介绍装饰者模式。假设我们有一间老式厨房,里面只能做中餐。
IKitchen.java
public interface IKitchen {
public void cook();
}
Kitchen.java
public class Kitchen implements IKitchen {
@Override
public void cook() {
System.out.println("Cook chinese food");
}
}
现在为了满足顾客不同口味的需求,打算引进法式餐和澳大利亚特色菜,但是也不能丢弃爱吃中餐的老顾客。为了满足这一需求,我们新建一个接口,继承原先的IKitchen接口,并在新的接口中拓展两个接口(法式餐以及澳大利亚特色菜)。
IMultipleKitchen.java
public interface IMultipleKitchen extends IKitchen {
public void cookFranceFood();
public void cookAustraliaFood();
}
MultipleKitchen.java
public class MultipleKitchen implements IMultipleKitchen {
private IKitchen iKitchen;
public MultipleKitchen(IKitchen iKitchen){
this.iKitchen = iKitchen;
}
@Override
public void cookFranceFood() {
System.out.println("Cook France food");
}
@Override
public void cookAustraliaFood() {
System.out.println("Cook Australia food");
}
@Override
public void cook() {
this.iKitchen.cook();
}
}
装饰者模式解决组合运算
需求背景:现有一家餐厅,基础套餐是两荤两素6块钱,加猪肉2块,加鸡蛋2块。写出一段代码能动态计算顾客点了什么餐和餐品的总价格。
首先我们创建一个IFood接口
IFood.java
public interface IFood {
public String name();
public int price();
}
定义一个装饰器类,并继承IFood接口
FoodDecorator.java
public class FoodDecorator implements IFood {
private IFood food;
public FoodDecorator(IFood food) {
this.food = food;
}
@Override
public String name() {
return this.food.name();
}
@Override
public int price() {
return this.food.price();
}
}
创建基本套餐BaseFood并继承IFood接口
public class BaseFood implements IFood {
@Override
public String name() {
return "两荤两素";
}
@Override
public int price() {
return 6;
}
}
创建加鸡蛋的装饰类
public class EggDecorator extends FoodDecorator {
public EggDecorator(IFood food) {
super(food);
}
@Override
public String name() {
return super.name() + "+鸡蛋";
}
@Override
public int price() {
return super.price() + 2;
}
}
创建加猪肉的装饰类
public class PorkDecorator extends FoodDecorator {
public PorkDecorator(IFood food) {
super(food);
}
@Override
public String name() {
return super.name() + "+猪肉";
}
@Override
public int price() {
return super.price() + 2;
}
}
编写测试用例
public static void main(String[] args) {
BaseFood baseFood = new BaseFood();
PorkDecorator porkDecorator = new PorkDecorator(baseFood);
EggDecorator eggDecorator = new EggDecorator(porkDecorator);
System.out.println("套餐:"+eggDecorator.name() + ",总价格:"+eggDecorator.price());
}
结果

258

被折叠的 条评论
为什么被折叠?



