专栏首页代码人生大话设计模式笔记(四)——装饰模式

大话设计模式笔记(四)——装饰模式

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/luo4105/article/details/76546343

第六章装饰模式

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

装饰模式UML

装饰模式的核心是对对象不断添加装饰的功能所使用的设计模式。

现有需求人和多种衣服,人需要自主搭配多种衣服,UML结构图如下

在上面的UML中,Decoiator存在Component对象属性,在构造器初始化。它的子类的wear方法会调用component.wear();这样实现Decoiator的子类去装饰Person类。

代码

Componet

public abstractclass Componet {

    public abstract void wear();
}

Person

public class Person extends Componet{
    private Stringname = "小菜";

    @Override
    public void wear() {
        System.out.println(name+ "穿衣");
    }
}

Decorator

public class Decorator extends Componet {

    public Componet componet;

    public Decorator(Componet componet) {
        this.componet = componet;
    }

    @Override
    public void wear() {
        componet.wear();
    }
}

JeansDecorator

public class JeansDecorator extends Decorator {

    public JeansDecorator(Componet componet) {
        super(componet);
    }

    @Override
    public void wear() {
        super.wear();
        System.out.println("穿牛仔裤");
    }
}

TieDecorator

public class TieDecorator extends Decorator {

    public TieDecorator(Componet componet) {
        super(componet);
    }

    @Override
    public void wear() {
        super.wear();
        System.out.println("打领带");
    }
}

TShirtDecorator

public class TShirtDecorator extends Decorator {

    public TShirtDecorator(Componet componet) {
        super(componet);
    }

    @Override
    public void wear() {
        super.wear();
        System.out.print("穿T恤");
    }
}

Test

public class Test {
    public static void main(String[] args) {
        Decorator tie = new TieDecorator(new Person());
        Decorator jeans = new JeansDecorator(tie);
        Decorator tshirt = new TShirtDecorator(jeans);

        tshirt.wear();
    }
}

打印

小菜穿衣

打领带

穿牛仔裤

穿T恤

总结

装饰模式是给核心功能添加新的功能,并能按照顺序执行。装饰模式将特定方法封装到类中,并让这个类包装它所需要的装饰类对象,因此,当需要执行特殊行为时,客户代码就可以在运行时根据需要有选择地、按顺序地使用装饰功能包装对象了。

装饰者模式是应用最普遍的设计模式之一。javaAPI中对装饰者模式的举例:Java I/O 库中 BufferedInputStream、DataInputStream、LineNumberInputStream、PushbackInputStream 等装饰者类对于 InputStream 的封装;JavaEE API 中的 ServletRequestWrapper、HttpServletRequestWrapper 对于 ServletRequest 的封装

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 浅析如何设计一个亿级网关

    API网关可以看做系统与外界联通的入口,我们可以在网关进行处理一些非业务逻辑的逻辑,比如权限验证,监控,缓存,请求路由等等。

    用户5397975
  • 揭秘Java高效随机数生成器

    在Java中一提到随机数,很多人就会想到Random类,如果有生成随机数的需求的时候,大多数时候都会选择使用Random来进行随机数生成,虽然其内部使用CAS来...

    用户5397975
  • 一文探讨堆外内存的监控与回收

    记得那是一个风和日丽的周末,太阳红彤彤,花儿五颜六色,96 年的普哥微信找到我,描述了一个诡异的线上问题:线上程序使用了 NIO FileChannel 的 堆...

    用户5397975
  • 一直使用AtomicInteger?试一试FiledUpdater

    在进入正题之前,这里先提出一个问题,如何在多线程中去对一个数字进行+1操作?这个问题非常简单,哪怕是Java的初学者都能回答上来,使用AtomicXXX,比如有...

    用户5397975
  • Java并发计数器探秘

    一提到线程安全的并发计数器,AtomicLong 必然是第一个被联想到的工具。Atomic* 一系列的原子类以及它们背后的 CAS 无锁算法,常常是高性能,高并...

    用户5397975
  • 咱们从头到尾说一次 Java 垃圾回收

    之前上学的时候有这个一个梗,说在食堂里吃饭,吃完把餐盘端走清理的,是 C++ 程序员,吃完直接就走的,是 Java 程序员。?

    用户5397975
  • 文件IO操作的最佳实践

    已经过去的中间件性能挑战赛,和正在进行中的 第一届 PolarDB 数据性能大赛 都涉及到了文件操作,合理地设计架构以及正确地压榨机器的读写性能成了比赛中获取较...

    用户5397975
  • 深入剖析来自未来的缓存-Caffeine

    读这篇文章之前希望你能好好的阅读: 你应该知道的缓存进化史 和 如何优雅的使用缓存? 。这两篇文章主要从一些实战上面去介绍如何去使用缓存。在这两篇文章中我都比较...

    用户5397975
  • 谈谈引用和Threadlocal的那些事

    某一天在某一个群里面的某个群友突然提出了一个问题:"threadlocal的key是弱引用,那么在threadlocal.get()的时候,发生GC之后,key...

    用户5397975
  • 设计的五大原则-SOLID

    最近在读《架构整洁之道》这一本书,这本书的确写得不错,最近也没有更新文章,一方面再忙工作,另一方面也再啃一些书。当然文章还是得更新,《架构整洁之道》里面有些有意...

    用户5397975

扫码关注云+社区

领取腾讯云代金券