装饰模式

定义

装饰模式允许你再不改变原有对象的前提下,为对象增加新的行为功能。

示例分析

图片说明
平时我们购买礼物的之后,会将礼物进行打包之后送出去。有时候直接装到纸盒子、有时候装到塑料盒子、有时候装到塑料盒子之后再装到纸盒子等。这里所说的“礼物”就是我们定义中的“原对象”,“打包”就是给对象新增的功能。
下面用代码来进行描述:
首先,我们先定义礼物的抽象类,包含礼物的描述信息 getDesc() ,该方法由子类实现

public abstract class AbstractGift {
    abstract String getDesc();
}

然后,我们定义具体的礼物(玩具汽车),并实现 getDesc()

public class ToyCarGift extends AbstractGift {
    @Override
    public String getDesc() {
        return "玩具汽车礼物";
    }
}

接下来,定义礼物装饰类的抽象类。该抽象类需要继承礼物的抽象类,以保证和被装饰的礼物有共同的行为。

public abstract class AbstractGiftWrapper extends AbstractGift {
    // 被装饰的礼物对象
    protected AbstractGift gift;
    protected AbstractGiftWrapper(AbstractGift gift) {
        this.gift = gift;
    }
}

然后,定义具体的礼物装饰类对礼物进行装饰。此处我们定义了塑料盒装饰类 和 纸盒装饰类。此处通过对被装饰的描述信息加以描述,以表示礼物被哪个类进行装饰。

public class PlasticGiftWrapper extends AbstractGiftWrapper{
    protected PlasticGiftWrapper(AbstractGift gift) {
        super(gift);
    }

    @Override
    String getDesc() {
        return "用塑料箱子包装的 [" + gift.getDesc() + "]";
    }
}

public class CartonGiftWrapper extends AbstractGiftWrapper {
    protected CartonGiftWrapper(AbstractGift gift) {
        super(gift);
    }

    @Override
    String getDesc() {
        return "用纸箱子包装的 [" + gift.getDesc() + "]";
    }
}

最后,我们通过Client来看看调用结果。里面可以对礼物进行任意的装饰,以及装饰的多层嵌套

public class Client {
    public static void main(String[] args) {
        // 定义玩具汽车礼物
        AbstractGift toyCar = new ToyCarGift();

        // 只用塑料盒包装礼物
        AbstractGiftWrapper plasticWrapper = new PlasticGiftWrapper(toyCar);
        System.out.println(plasticWrapper.getDesc());
        System.out.println();

        // 只用纸盒包装礼物
        AbstractGiftWrapper cartonWrapper = new CartonGiftWrapper(toyCar);
        System.out.println(cartonWrapper.getDesc());
        System.out.println();


        // 先用纸盒,再用塑料盒包装
        AbstractGiftWrapper multiWrapper1 = new PlasticGiftWrapper(
                new CartonGiftWrapper(
                        toyCar
                )
        );
        System.out.println(multiWrapper1.getDesc());
        System.out.println();

        // 先用塑料盒包装,再用纸盒包装
        AbstractGiftWrapper multiWrapper2 = new CartonGiftWrapper(
                new PlasticGiftWrapper(
                        toyCar
                )
        );
        System.out.println(multiWrapper2.getDesc());
    }
}

优缺点

优点

  1. 无需创建子类,即可拓展对象的行为。
  2. 装饰可以进行嵌套,可以用多个装饰类进行多种装饰操作

缺点

  1. 在多个装饰类嵌套的情况,需要额外考虑嵌套顺序的情况,
全部评论

相关推荐

10-31 20:07
门头沟学院 Java
点赞 评论 收藏
分享
想干测开的tomca...:让我来压力你!!!: 这份简历看着“技术词堆得满”,实则是“虚胖没干货”,槽点一抓一大把: 1. **项目描述是“技术名词报菜名”,没半分自己的实际价值** 不管是IntelliDoc还是人人探店,全是堆Redis、Elasticsearch、RAG这些时髦词,但你到底干了啥?“基于Redis Bitmap管理分片”是你写了核心逻辑还是只调用了API?“QPS提升至1500”是你独立压测优化的,还是团队成果你蹭着写?全程没“我负责XX模块”“解决了XX具体问题”,纯把技术文档里的术语扒下来凑字数,看着像“知道名词但没实际动手”的实习生抄的。 2. **短项目塞满超纲技术点,可信度直接***** IntelliDoc就干了5个月,又是RAG又是大模型流式响应又是RBAC权限,这堆活儿正经团队分工干都得小半年,你一个后端开发5个月能吃透这么多?明显是把能想到的技术全往里面塞,生怕别人知道你实际只做了个文件上传——这种“技术堆砌式造假”,面试官一眼就能看出水分。 3. **技能栏是“模糊词混子集合”,没半点硬核度** “熟悉HashMap底层”“了解JVM内存模型”——“熟悉”是能手写扩容逻辑?“了解”是能排查GC问题?全是模棱两可的词,既没对应项目里的实践,也没体现深度,等于白写;项目里用了Elasticsearch的KNN检索,技能栏里提都没提具体掌握程度,明显是“用过但不懂”的硬凑。 4. **教育背景和自我评价全是“无效信息垃圾”** GPA前10%这么好的牌,只列“Java程序设计”这种基础课,分布式、微服务这些后端核心课提都不提,白瞎了专业优势;自我评价那堆“积极认真、细心负责”,是从招聘网站抄的模板吧?没有任何和项目挂钩的具体事例,比如“解决过XX bug”“优化过XX性能”,纯废话,看完等于没看。 总结:这简历是“技术名词缝合怪+自我感动式凑数”,看着像“背了后端技术栈名词的应届生”,实则没干货、没重点、没可信度——面试官扫30秒就会丢一边,因为连“你能干嘛”都没说清楚。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务