`
chendw_hz
  • 浏览: 11295 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

装饰器模式(包裹模式)

 
阅读更多

装饰器模式的形象理解油漆工刷油漆。油漆工是装饰器角色,被刷者是被装饰器角色。

装饰器分四个角色

抽象构件角色:增加附加功能的一个抽象接口。也就是被装饰的一个抽象角色。

具体构件角色:抽象构件角色的实现类。

装饰器角色:持有抽象构件觉得一个变量引用。切也要与抽象构件角色同一接口。

具体装饰器角色:装饰器角色的实现类。具体附加功能到抽象角色。

说了这么多。。还是用实例来描述比较形象。下面一女孩子不同穿着来说明

譬如女孩子喜欢穿裙子。喜欢咋马尾辫。不同打扮。但是这个女孩子还是没有变。

//女孩接口

public interface Girl{

   //女孩子逛街行为

   public void goShopping();

}

//具体实现类 

public class Interface GirlImpl{

   public void goShopping(){

     System.out.println("今天我就逛逛街,亲爱的陪陪我嘛,陪我,我就嫁给你...哈哈");

 }

}

 

//装饰器的抽象类。定义抽象的父类接口

public interface DecorationGirl extends Girl{

 

}

 

//穿LV 裙子的装饰的女孩子

public class SkirtDecorationGirl implements DecorationGirl{

  //女孩子对象的引用属性

  private Girl girl;

  

  public SkirtDecorationGirl(Girl girl){

       this.girl=girl;

 }

  private void wearSkirt(){

    System.out.println("亲爱的,谢谢你。我今天要穿你送给我的LV裙子逛街...");

}

 

public void goShopping(){

   wearSkirt();

   girl.goShopping();

}

}

 //既穿LV裙子。又骑捷安特的自行车的女孩子。还是女孩子

public class GiantBikeGirl extends SkirtDecoration{

    public GiantBikeGirl(Girl girl){

         super(girl);

   }

 

   private void bikeGiant(){

         System.out.println("我今天要骑你送给我的捷安特的自行车。这车好便宜啊。才5000多!");

}

 

 public void goShopping(){

         bikeGiant();

         girl.goShopping();

}

}

 

//客户端调用

public class Client{

   public static void main(String arg[]){

    Girl girl = new GirlImpl();

    Girl skirtGirl = new SkirtDecorationGirl (girl);

   Girl giantGirl = new GiantBikeGirl(skirtGirl);

    //只穿裙子的女孩子逛街

   skirtGirl.goShopping();

   //又穿裙子。又骑自行车的女孩子逛街

  giantGirl.goShopping();

 }

}

 

//穿裙子逛街的女孩子

亲爱的,谢谢你。我今天要穿你送给我的LV裙子逛街...

今天我就逛逛街,亲爱的陪陪我嘛,陪我,我就嫁给你...哈哈

//既骑车又穿裙子的逛街的女孩子

我今天要骑你送给我的捷安特的自行车。这车好便宜啊。才5000多!"

亲爱的,谢谢你。我今天要穿你送给我的LV裙子逛街...

今天我就逛逛街,亲爱的陪陪我嘛,陪我,我就嫁给你...哈哈

GiantBikeGirl 和SkirtDecorationGirl 可以任意组合。可以得出不同打扮的女孩子逛街。总之不管是什么穿着。都是这个女 孩子。不会改变。

应用场景:

1, 需要扩展一个类的功能或者附件责任同时也可以撤销一个类的动态的功能。

2.需要增加一些基本的功能的排列组合而产生的大量的功能时。

有点:

1,很方便的扩展一个类的功能。同时比继承更具灵活性。

2.可以排列组合装饰类产生大量的新增功能。

缺点:

 由于装饰器类设计组合灵活性导致比继承更容易出错。

备注:装饰器的模式的核心就是接口要统一.基本行为还是抽象构件的行为。所以要持有被装饰角色的引用。

分享到:
评论

相关推荐

    JAVA设计模式学习12——装饰器模式

    装饰器模式是面向对象设计模式的一种,主要用于在不改变原有对象结构的情况下,动态地为对象增加新的功能。这种模式在Java中尤其常见,因为它允许我们遵循“开闭原则”——对扩展开放,对修改关闭。 装饰器模式的...

    23设计模式之装饰器模式-前端篇.pptx

    在前端开发中,装饰器模式常用于实现AOP(面向切面编程),比如日志记录、性能监控、权限控制等功能。通过定义装饰器函数,可以在不侵入原代码逻辑的情况下,控制代码的执行流程。例如,可以创建一个`logDecorator`...

    实例讲解Ruby使用设计模式中的装饰器模式的方法

    装饰器模式的核心思想是通过创建一个包装对象,即装饰器,来包裹真实对象,从而扩展其功能。 在描述中提到的实例中,`SimpleWriter` 是一个基础的文本写入类,它可以打开文件并写入一行文本。装饰器模式的实现始于 ...

    【Java设计模式-源码】装饰器模式:动态扩展类的功能

    - 装饰器模式允许你在运行时通过将对象包裹在装饰器类的对象中来动态地改变对象的行为。 3. **维基百科解释**: - 在面向对象编程中,装饰器模式是一种设计模式,它允许静态或动态地向单个对象添加行为,而不会...

    7. 装饰器模式1

    装饰器模式的核心思想是封装,它通过创建一个新的对象来包裹原有的对象,并且这个新对象的类是原有对象类的子类或者实现了相同的接口。这样,新对象可以在调用原有对象的方法时,添加自己的额外操作,从而达到扩展...

    装饰器模式的简单demo

    装饰器模式是一种结构型设计模式,它允许在运行时向对象添加新的行为或职责,而无需修改原有类的代码。这种模式通过创建包装对象(即装饰器)来包裹原对象,装饰器对象拥有与原对象相同的接口,因此可以在不改变...

    易语言对象模式之一装饰器模式,不修改程序结构下而添加新的功能

    装饰器模式是面向对象设计中的一种经典模式,它在不改变原有对象的基础上,通过包裹(wrapping)对象来扩展其功能。这种模式的核心思想是分离装饰功能与对象本身,使得对象的功能可以被灵活地增强,同时保持代码的...

    9.设计模式-装饰器模式1

    装饰器模式(Decorator Pattern)是一种结构型设计模式,它的核心思想是在不修改原有对象的前提下,通过包装(包裹)原对象并扩展其行为来增加功能。这种模式常用于在运行时动态地给对象添加新的职责,使得系统具有...

    装饰者模式的典型应用。

    这个装饰器类会包裹一个标准的X509TrustManager实例,并在其验证过程中插入自定义的验证规则,以适应更复杂的业务需求。 装饰者模式的优点在于它可以提供一种灵活的方式,通过组合多个装饰器来实现复杂的功能,而...

    开发模式之装饰模式

    这种模式通过创建一个新的包装类来包裹真实的对象,从而在不改变原始类文件的基础上为其增加更多功能或责任。 #### 模式背景与应用场景 在软件开发过程中,我们常常会遇到这样的需求:为一个系统或模块中的某些对象...

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

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

    装饰器(Decorator)模式

    装饰器模式的实现方式并不局限于Python,许多其他编程语言也支持类似的概念,如Java的动态代理、C#的特性(Attributes)等,虽然语法和实现机制可能有所不同,但核心思想是一致的。 在实际开发中,合理利用装饰器...

    java装饰模式示例代码及类图

    通过装饰模式,我们可以根据需要组合不同的装饰器,从而达到所需的功能组合。 总结来说,装饰模式是一种强大的设计工具,它允许我们以一种松散耦合的方式扩展对象的功能。通过分析提供的代码和类图,我们可以深入...

    C++装饰模式

    这种模式通过创建一个包装对象来包裹真实的对象,并在不改变现有类结构的情况下为对象添加新的职责。 在软件开发中,装饰模式经常被用来扩展功能或者增加行为,尤其是在对象的行为需要灵活地增加或减少时尤为有用。...

    python 实现 装饰模式

    这里,`Sugary`和`Creamy`装饰器类都包裹了一个`Coffee`对象,并在其`get_cost`方法中添加了额外的成本。使用这些装饰器,我们可以创建各种装饰后的咖啡: ```python coffee = Coffee() sugary_coffee = Sugary...

    适配器模式,装饰模式和代理模式1

    例如,我们可以定义一个装饰器接口,里面包含了需要被装饰的方法,然后实现这个接口,并将其与原有的类结合起来。 三、代理模式 代理模式是一种结构型设计模式,它允许在不改变原有类的基础上增加新的功能。其实现...

    java设计模式之装饰模式

    3. **装饰器**:装饰器类持有对组件的引用,并实现组件接口。它可以在调用原始对象的方法之前或之后添加新的行为。装饰器类可以有具体的子类,每个子类实现一种特定的增强行为。 ```java public abstract class ...

    PHP设计模式之装饰器模式实例详解

    装饰器模式的定义:装饰器模式是一种动态地给一个对象增加一些额外的职责的设计模式,就增加功能来说,装饰器模式比生成子类更为灵活。它通过创建一个装饰类来包裹真实的对象,并在装饰类中实现新的功能,进而达到...

    iOS 设计模式 装饰模式

    装饰模式是一种结构型设计模式,通过将一个对象包裹在一个装饰类中,装饰类可以增加、修改或增强原对象的功能。与继承相比,装饰模式具有更大的灵活性,因为可以通过叠加多个装饰类来实现更复杂的组合功能,而不会...

Global site tag (gtag.js) - Google Analytics