装饰者模式

本文介绍了装饰者模式,通过托尼·斯塔克和钢铁侠的例子展示了如何在不改变类结构的情况下动态增强对象功能。装饰者模式适用于不便于继承或扩展功能的场景,如IO流中的包装流设计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是装饰者模式

装饰者模式是23种设计模式中结构型模式的一种,它的核心思想是在不必改变类文件及不使用继承的情况下,通过装饰者包裹目标对象,动态地扩展目标对象的功能。

装饰者模式的实现

接下来咱们以钢铁侠来举例,首先创建抽象组件和具体组件

package com.qianfeng.ran;

/*
 * 
 *      抽象组件
 *          人类
 */
public abstract class Human {
    //行为方法
    public abstract void behavior();
}


/*
 * @author:
 *      具体组件类
 *          托尼斯塔克
 */
class TonyStark extends Human{
    //拯救世界的行为
    @Override
    public void behavior() {
        System.out.println("运用科技和财富拯救世界");
    }

再创建抽象装饰者和装饰者具体实现类。

package com.qianfeng.ran;

/*
 * 
 *      抽象装饰者
 *          超级英雄类
 */
public abstract class Superhero extends Human{
    private Human human;
    //获取被装饰对象
    public Superhero(Human human) {
        this.human = human;
    }

    @Override
    public void behavior() {
        //执行目标对象原本的行为
        human.behavior();
    }
}


/*
 * 
 *      具体装饰者类
 *          钢铁侠类
 */
class IronMan extends Superhero {
    public IronMan(Human human) {
        super(human);
    }

    //增强目标对象的行为
    @Override
    public void behavior() {
        super.behavior();
        System.out.println("穿戴钢铁战衣拯救世界");
    }
}

最后我们通过装饰者模式,来模拟没有钢铁战衣的托尼斯塔克和有钢铁战衣的区别。

package com.qianfeng.ran;

/*
 * 
 *          客户端
 */
public class Demo {
    public static void main(String[] args) {
        //创建托尼斯塔克对象
        TonyStark tonyStark = new TonyStark();
        //执行结果:
        //运用科技和财富拯救世界
        tonyStark.behavior();

        //通过装饰者模式使托尼斯塔克对象装饰成钢铁侠对象
        IronMan ironMan = new IronMan(tonyStark);
        //执行结果:
        //运用科技和财富拯救世界
        //穿戴钢铁战衣拯救世界
        ironMan.behavior();
    }
}

总结
使用装饰者模式可以动态地给目标对象添加功能,或者在原有的功能上使之更加强大,而这些功能也能动态的撤销。当不便于使用继承方式增强对象的功能,或者使用继承后不便于扩展和维护,装饰者模式就是一种很好的模式。

在IO流中,包装流使用的就是装饰者模式,例如:BufferedInputStream、BufferedOutputStream、BufferedWriter、BufferedReader等等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

真不爱学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值