装饰器模式
Decorator design pattern is used to add additional features or behaviors to a particular instance of a class, while not modifying the other instances of same class.
特征
- 给一个类特定实例添加额外的特征或者行为
- 而不修改类的其他实例,也不是修改接口
UML 类图
image.png组件
- Component:接口,定义统一行为,在程序运行时,声明接口包装器
- Component:接口具体的功能实现
- Decorator:这是一个抽象类包含了 component 对象的引用,同时实现了 Component 接口
- Concrete decorator: 继承 Decorator ,再次基础之上添加了额外的功能。
说白了就是,你有一个实例,你放了另一个实例在这个实例里面。
他们都支持相同的接口,外面的实例叫做 装饰器,你调用外面这个装饰器实例对象,它传递给里面的实例方法。
案例
image.png- 创建一个食物接口
public interface Food {
//准备食物
public String prepareFood();
// 食物价格
public double foodPrice();
}
- 创建一个蔬菜食物,实现食物的接口和覆写了它的方法
public class VegFood implements Food {
public String prepareFood(){
return "Veg Food";
}
public double foodPrice(){
return 50.0;
}
}
- 创建一个食物装饰器抽象类,它实现了食物的接口和覆写了它所有的方法,添加了装饰食物的功能
public abstract class FoodDecorator implements Food{
private Food newFood;
public FoodDecorator(Food newFood) {
this.newFood=newFood;
}
@Override
public String prepareFood(){
return newFood.prepareFood();
}
public double foodPrice(){
return newFood.foodPrice();
}
}
- 创建一个非蔬菜食物,继承食物装饰器 和覆写了它所有的方法,装饰了非蔬菜食物的特征
public class NonVegFood extends FoodDecorator{
public NonVegFood(Food newFood) {
super(newFood);
}
public String prepareFood(){
return super.prepareFood() +" With Roasted Chiken and Chiken Curry ";
}
public double foodPrice() {
return super.foodPrice()+150.0;
}
}
- 创建一个中国食物,继承食物装饰器 和覆写了它所有的方法,装饰了中国食物特殊的特征
public class ChineeseFood extends FoodDecorator{
public ChineeseFood(Food newFood) {
super(newFood);
}
public String prepareFood(){
return super.prepareFood() +" With Fried Rice and Manchurian ";
}
public double foodPrice() {
return super.foodPrice()+65.0;
}
}
- 创建一个装饰器模式消费者类,它会使用食物接口来使客户得到他想要的类型的事务
public class DecoratorPatternCustomer {
private static int choice;
public static void main(String args[]) throws NumberFormatException, IOException {
do{
System.out.print("========= Food Menu ============ \n");
System.out.print(" 1. Vegetarian Food. \n");
System.out.print(" 2. Non-Vegetarian Food.\n");
System.out.print(" 3. Chineese Food. \n");
System.out.print(" 4. Exit \n");
System.out.print("Enter your choice: ");
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
choice=Integer.parseInt(br.readLine());
switch (choice) {
case 1:{
VegFood vf=new VegFood();
System.out.println(vf.prepareFood());
System.out.println( vf.foodPrice());
}
break;
case 2:{
Food f1=new NonVegFood((Food) new VegFood());
System.out.println(f1.prepareFood());
System.out.println( f1.foodPrice());
}
break;
case 3:{
Food f2=new ChineeseFood((Food) new VegFood());
System.out.println(f2.prepareFood());
System.out.println( f2.foodPrice());
}
break;
default:{
System.out.println("Other than these no food available");
}
return;
}//end of switch
}while(choice!=4);
}
}
广泛使用
- Java iO library classes e.g. BufferedInputStream bs = new BufferedInputStream(new FileInputStream(new File(“File1.txt”)));
- MyBatis 的 PerpetualCache、BlockingCache、FifoCache、LruCache 等给缓存装饰了额外功能
网友评论