设计模式之装饰者模式--钢铁侠的形成

发布时间 2023-06-12 10:41:04作者: 可爱的小锋

前言

本文主要讲述java常见设计模式之装饰者模式,文中使用通俗易懂的案例,使你更好的学习本章知识点并理解原理,做到有道无术。

一.什么是装饰者模式

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

二.生活中的装饰者器模式

1.钢铁侠

托尼斯塔克,漫威著名的超级英雄钢铁侠,钢铁侠最出名的就是他的钢铁战衣,而只有穿戴上钢铁战衣的托尼斯塔克才是钢铁侠,通过钢铁战衣让自己成为钢铁侠,做到一些普通人完成不了的事。这样的钢铁侠就跟设计模式中的装饰者模式类似。
在这里插入图片描述

2.蝙蝠侠

布鲁斯韦恩,DC著名的超级英雄蝙蝠侠,穿上了蝙蝠装的布鲁斯韦恩才是蝙蝠侠,通过蝙蝠装和蝙蝠车这些装备让布鲁斯韦恩变得更加强大,再结合自身强大的格斗能力把哥谭的反派们整得服服帖帖。这样的蝙蝠侠就跟设计模式中的装饰者模式类似。

3.黑豹

穷人靠变异,富人靠科技,而黑豹这个顶级富豪又靠变异又靠科技,打破了这句话。心形草+黑豹装两者结合才是漫威英雄黑豹,而由心形草和黑豹装增强的黑豹就跟设计模式中的装饰者模式类似。

三.装饰者模式的实现

接下来江帅以钢铁侠来举例,通过装饰者模式来实现。首先创建抽象组件人类和具体组件托尼斯塔克类

package com.qianfeng.ran;

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


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

再创建抽象装饰者超级英雄类和装饰者具体实现类钢铁侠类

package com.qianfeng.ran;

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

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


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

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

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

package com.qianfeng.ran;

/*
 * @author:江帅
 *          客户端
 */
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等等

下一章,将带大家学习经纪人的工作(设计模式之代理模式)