`
langgufu
  • 浏览: 2306996 次
  • 性别: 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便是使用了装饰者模式
分享到:
评论

相关推荐

    装饰者模式——Decorator

    装饰者模式(Decorator)是一种设计模式,用于在运行时动态地给对象添加额外的责任或功能。它是结构型设计模式的一种,能将行为的增加与对象的创建分离,使得我们可以独立地扩展对象的功能。 在Java或其他面向对象...

    Java设计模式之-Decorator装饰模式

    装饰模式通常涉及到四个主要角色:Component(组件)、ConcreteComponent(具体组件)、Decorator(装饰者)和ConcreteDecorator(具体装饰者)。 1. Component(组件):定义一个对象接口,所有被装饰的对象以及...

    [结构型模式] head first 设计模式之装饰者模式(decorator)

    装饰者模式(Decorator Pattern)是结构型设计模式之一,它允许在运行时向对象添加新的行为或职责,而无需修改对象的源代码。这个模式的名字来源于装饰艺术,它通过添加额外的装饰来增强一个物体的外观,同样地,...

    设计模式--装饰者模式java例子

    装饰者模式是软件设计模式中的一种结构型模式,它的主要目的是动态地给对象添加新的功能,而无需修改原有代码。在Java中,装饰者模式通常通过继承和组合来实现,它提供了一种比继承更灵活的方式来扩展对象的功能。...

    装饰者模式 - PHP版

    装饰者模式是一种结构型设计模式,它允许在运行时向对象添加新的行为或职责,而无需修改对象的源代码。在PHP中,装饰者模式尤其有用,因为它提供了灵活性,可以在不改变类原有结构的情况下扩展其功能。下面我们将...

    jouryfirst#weekly-1#175.精读《设计模式 - Decorator 装饰器模式》1

    “就增加功能来说,Decorator 模式相比生成子类更为灵活” 这句话的含义是,组合比继承更灵活,当可拓展的功能很多时,继承方案会产生大量的子类,而组合可以提

    装饰者模式(Decorator Pattern)原理图

    装饰者模式(Decorator Pattern)是一种结构型设计模式,它的定义是在不改变原有对象结构的基础上,动态地给该对象增加一些职责(即增加其额外功能)。这种模式允许向一个现有的对象添加新的功能,同时又不改变其...

    Head First 设计模式 (三) 装饰者模式(decorator pattern) C++实现

    装饰者模式(Decorator Pattern)是一种结构型设计模式,它允许我们向对象添加新的行为或职责,而无需修改对象的原始代码。在C++中实现装饰者模式,可以让我们灵活地扩展对象的功能,同时保持代码的可读性和可维护性...

    设计模式之装饰者模式-极客学院

    装饰者模式是面向对象设计中的一种结构型模式,它的主要目的是动态地给一个对象添加一些额外的职责,即增加功能,同时又不破坏原有的结构。装饰者模式是一种比继承更灵活的扩展对象行为的方式,它避免了类爆炸问题,...

    设计模式之装饰模式(Decorator Pattern)

    装饰模式(Decorator Pattern)是一种结构型设计模式,它在不改变原有对象的基础上,通过包裹一个对象并为其添加新的行为或责任,实现对对象功能的扩展。这种模式在软件开发中非常常见,尤其当需要在运行时动态改变...

    前端大厂最新面试题-decorator.docx

    Decorator 是 ES6 中的一种设计模式,顾名思义,它是一种装饰器模式。Decorator 的本质是一个普通的函数,用于扩展类属性和类方法。它可以在不改变原有代码的情况下,对原来功能进行扩展。 Decorator 的优点有两个...

    Design Pattern - Decorator

    装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许在运行时给对象添加新的行为或职责,同时保持对象的接口不变。这种模式的核心在于,它动态地将责任附加到对象上,通过将对象包装在一个装饰类中来扩展...

    设计模式 - 装饰者模式.rar

    - **ConcreteComponent(具体组件)**:实现了Component接口的类,是装饰模式要装饰的目标对象。它定义了初始行为,不包含任何额外装饰。 - **Decorator(装饰者)**:持有对Component对象的引用,并且实现...

    通过C#实现设计模式-装饰模式(DecoratorPattern).rar

    装饰模式(Decorator Pattern)是一种结构型设计模式,它允许你向一个现有的对象添加新的功能,同时又不改变其结构。装饰模式通过创建一个装饰类,该类包装了原始类的实例,并在调用原始类方法之前或之后添加额外的...

    react-global-event-decorator:滥用装饰器模式

    滥用装饰器模式 安装 如果您有风险,请继续使用此功能。 你是大人 npm install --save react-global-event-decorator 这个是来做什么的? 当您单击DOM中的任意位置时,曾经有一个React组件需要执行操作吗? 它...

    java-io-decorator.pdf

    在提供的内容中,可以看到具体实现了装饰器模式的类和方法,例如使用BufferedInputStream来包装FileInputStream以实现缓冲功能,还有通过Decorator类的示例来展示装饰器模式的结构,其中Decorator作为具体装饰类实现...

    设计模式专题之(七)装饰模式---设计模式装饰模式示例代码(python--c++)

    让我们先从Python开始,通过`Decorator.py`文件中的示例来理解装饰模式。 在Python中,装饰器是一种特殊类型的函数,可以用来修改其他函数的功能或行为。装饰器函数接收一个函数作为参数,并返回一个新的函数。以下...

Global site tag (gtag.js) - Google Analytics