`
langgufu
  • 浏览: 2289669 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

装饰者模式-Decorator

 
阅读更多

装饰者模式:动态地将责任附加到对象上,若要扩展对象,装饰者模式提供了比继承更弹性的替代方案

 要点:装饰者与被装饰者拥有共同的超类,继承的目的是继承类型,而不是行为

装饰者包含一个超类的对象,这样,可以在被装饰者行为前或者行为后加上新的行为,甚至取代原有的行为

装饰者会使程序中出现很多小类,增加使用难度

使用场景:对象由主体+许多可选的部件或者功能构成,使用继承或者接口会产生很多类,且很难扩展。例如,现在需要一个汉堡,主体是鸡腿堡,可以选择添加生菜、酱、辣椒等等许多其他的配料,这种情况下就可以使用装饰者模式。

实例:

 

  • 汉堡基类
    [java] view plaincopy
    1. package decorator;  
    2.   
    3. public abstract class Humburger {  
    4.       
    5.     protected  String name ;  
    6.       
    7.     public String getName(){  
    8.         return name;  
    9.     }  
    10.       
    11.     public abstract double getPrice();  
    12.   
    13. }  


  • 鸡腿堡类
    [java] view plaincopy
    1. package decorator;  
    2.   
    3. public class ChickenBurger extends Humburger {  
    4.       
    5.     public ChickenBurger(){  
    6.         name = "鸡腿堡";  
    7.     }  
    8.   
    9.     @Override  
    10.     public double getPrice() {  
    11.         return 10;  
    12.     }  
    13.   
    14. }  


  • 配料的基类
    [java] view plaincopy
    1. package decorator;  
    2.   
    3. public abstract class Condiment extends Humburger {  
    4.       
    5.     public abstract String getName();  
    6.   
    7. }  


  • 生菜
    [java] view plaincopy
    1. package decorator;  
    2.   
    3. public class Lettuce extends Condiment {  
    4.       
    5.     Humburger humburger;  
    6.       
    7.     public Lettuce(Humburger humburger){  
    8.         this.humburger = humburger;  
    9.     }  
    10.   
    11.     @Override  
    12.     public String getName() {  
    13.         return humburger.getName()+" 加生菜";  
    14.     }  
    15.   
    16.     @Override  
    17.     public double getPrice() {  
    18.         return humburger.getPrice()+1.5;  
    19.     }  
    20.   
    21. }  


  • 辣椒
    [java] view plaincopy
    1. package decorator;  
    2.   
    3. public class Chilli extends Condiment {  
    4.       
    5.     Humburger humburger;  
    6.       
    7.     public Chilli(Humburger humburger){  
    8.         this.humburger = humburger;  
    9.           
    10.     }  
    11.   
    12.     @Override  
    13.     public String getName() {  
    14.         return humburger.getName()+" 加辣椒";  
    15.     }  
    16.   
    17.     @Override  
    18.     public double getPrice() {  
    19.         return humburger.getPrice();  //辣椒是免费的哦  
    20.     }  
    21.   
    22. }  


  • 测试
    [java] view plaincopy
    1. package decorator;  
    2.   
    3. public class Test {  
    4.   
    5.     /** 
    6.      * @param args 
    7.      */  
    8.     public static void main(String[] args) {  
    9.         Humburger humburger = new ChickenBurger();  
    10.         System.out.println(humburger.getName()+"  价钱:"+humburger.getPrice());  
    11.         Lettuce lettuce = new Lettuce(humburger);  
    12.         System.out.println(lettuce.getName()+"  价钱:"+lettuce.getPrice());  
    13.         Chilli chilli = new Chilli(humburger);  
    14.         System.out.println(chilli.getName()+"  价钱:"+chilli.getPrice());  
    15.         Chilli chilli2 = new Chilli(lettuce);  
    16.         System.out.println(chilli2.getName()+"  价钱:"+chilli2.getPrice());  
    17.     }  
    18.   
    19. }  


  • 输出
    [java] view plaincopy
    1. 鸡腿堡  价钱:10.0  
    2. 鸡腿堡 加生菜  价钱:11.5  
    3. 鸡腿堡 加辣椒  价钱:10.0  
    4. 鸡腿堡 加生菜 加辣椒  价钱:11.5  


java.io便是使用了装饰者模式
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics