Decorator

作者: 93张先生 | 来源:发表于2020-09-12 00:01 被阅读0次

装饰器模式

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 等给缓存装饰了额外功能

相关文章

网友评论

    本文标题:Decorator

    本文链接:https://www.haomeiwen.com/subject/xzgyektx.html