设计模式——装饰器模式

 相关链接:

【设计模式】专栏:【设计模式】专栏

相关例子可下载: Java常用设计模式例子

装饰器模式

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

意图

动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。

优点

  • 装饰类和被装饰类可以独立发展,不会相互耦合。

  • 装饰器是继承的有力补充,比继承灵活,在不改变原有对象的情况下,动态的给一个对象扩展功能,即插即用

  • 装饰器模式完全遵守开闭原则

缺点

  • 装饰器模式会增加许多子类,过度使用会增加程序的复杂性

装饰器的角色

装饰器模式主要包含以下角色:

抽象构件(Component)角色

定义一个抽象接口,以规范准备接收附加责任的对象。

具体构件(Concrete Component)角色

实现抽象构件,通过装饰角色为其添加一些职责。

抽象装饰(Decorator)角色

继承抽象构件(Component),并包含具体构件(Concrete Component)的实例,可以通过其子类扩展具体构件的功能。

具体装饰(Concrete Decorator)角色

实现抽象装饰的(Decorator)的相关方法,并给具体构件(Concrete Component)对象添加附加的责任。

示例代码

抽象构件

/**
 * 装饰器模式——抽象构件
 *
 * (奶茶)
 *
 */
public interface Milkytea {
    /**
     * 添加配料
     */
    public void addIngredients();
}

具体构建


/**
 * 装饰器模式——具体构件
 *
 * (烧仙草)
 *
 */
public class GrassJelly implements Milkytea{

    @Override
    public void addIngredients() {
        System.out.println("烧仙草");
    }
}

抽象装饰

/**
 * 装饰器模式——抽象装饰
 *
 * (配料)
 *
 */
public abstract class Ingredients implements Milkytea{
    // 创建奶茶对象
    protected Milkytea milkytea;

    /**
     * 构造函数——指定某杯奶茶
     * @param milkytea
     */
    public Ingredients(Milkytea milkytea) {
        this.milkytea = milkytea;
    }

    /**
     * 给奶茶添加配料
     */
    @Override
    public void addIngredients() {
        this.milkytea.addIngredients();
    }
}

具体装饰

/**
 * 装饰器模式——具体装饰
 *
 * (珍珠)
 *
 */
public class Pearl extends Ingredients{
    /**
     * 构造函数——指定某杯奶茶
     *
     * @param milkytea
     */
    public Pearl(Milkytea milkytea) {
        super(milkytea);
    }

    @Override
    public void addIngredients() {
        super.addIngredients();
        System.out.println("加珍珠");
    }
}

/**
 * 装饰器模式——具体装饰
 *
 * (花生)
 *
 */
public class Peanut extends Ingredients{
    /**
     * 构造函数——指定某杯奶茶
     *
     * @param milkytea
     */
    public Peanut(Milkytea milkytea) {
        super(milkytea);
    }

    @Override
    public void addIngredients() {
        super.addIngredients();
        System.out.println("加花生");
    }
}

测试类

/**
 * 装饰器模式
 *
 */
public class DecoratorPatternDemo {

    public static void main(String[] args) {
        // 构建一杯烧仙草
        GrassJelly grassJelly = new GrassJelly();
        // 构建珍珠配料,并指定添加到烧仙草
        Pearl pearl = new Pearl(grassJelly);
        // 构建花生配料,并指定添加到已加珍珠的烧仙草
        Peanut peanut = new Peanut(pearl);
        // 添加配料
        peanut.addIngredients();
    }

}

   结束语

1、更多设计模式内容请看【设计模式】专栏

2、相关例子代码可下载: Java常用设计模式例子

PS:  【 Java常用设计模式例子 】 内已包含 【设计模式】专栏 里所涉及的代码,需要代码的同学可以下载哦,如果之前已下载过的同学,就不需要重复下载啦~

以上内容如有不正确或需要补充的地方,还请多多请教,会及时更新改正~

欢迎评论~ 感谢点赞~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java装饰器设计模式是一种结构型设计模式,用于动态地给一个对象添加额外的功能,而不改变其接口。它通过将对象包装在一个具有相同接口的装饰器类中,来实现对原始对象的增强。装饰器模式的主要优点是可拓展性强,可以在不改变原有对象的情况下,动态地给对象扩展功能,即插即用。同时,装饰器模式也易于维护,当某个功能出现问题时,可以直接找到相关的代码进行修复。通过使用不同的装饰类及其排列组合,可以实现不同的效果。然而,装饰器模式会增加许多子类,从而使得代码变得繁多,增加了程序的复杂性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Java设计模式——装饰器模式](https://blog.csdn.net/tang_seven/article/details/128977529)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Java设计模式之一:装饰器模式](https://blog.csdn.net/yangyin1998/article/details/131508999)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值