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