巧妙的运用装饰器,让你的代码高出一个逼格!

简介: 又到了周末了,阿粉祝各位网友中秋快乐,阖家团圆!同时,节日期间,阿粉不打烊,欢迎网友观看吐槽~

一、介绍

装饰器模式,顾名思义,就是在一个类上增加功能,以起到装饰的作用。

我们都知道,如果想给某个类新增功能,但又要避免在原类上修改代码,最常用的方式就是新增一个类来继承目标类,但是如果增加多的话,会使类的数量爆炸式增长,为管理带来巨大的麻烦,装饰器模式就比较好地解决了这一点。

从设计的角度看,装饰器模式涉及到四个角色:

  • 被装饰类:要进行扩展的源类;
  • 装饰器类:通过该类可以给被装饰类动态添加额外的方法,多以抽象为主;
  • 具体的装饰类:该类实现自装饰器类,已完成完整的算法;
  • 客户角色:客户类提出使用具体类的请求;

今天我们一起来看看深度了解一下装饰器的玩法!

二、代码示例

下面以生产一件衣服为例,一块布料裁剪好了之后做出的衣服样子还可以,但是这样的衣服是卖不出去的,因为毫无美感,因此我们需要通过一些装饰来使衣服变得好看。

我们先来创建一个抽象类或者接口,定义一个骨架,如下:

/**
 * 建立基本骨架
 */
public interface Clothes {
    void makeClothes();
}

接着创建一个我们需要装饰的源类,如下:

/**
 * 被装饰类
 */
public class MakeClothes implements Clothes {
    @Override
    public void makeClothes() {
        System.out.println("制作一件衣服");
    }
}

再来创建我们的主角,装饰类,如下:

/**
 * 装饰类
 */
public class Decorator implements Clothes {
    private Clothes clothes;
    public Decorator(Clothes clothes) {
        this.clothes = clothes;
    }
    @Override
    public void makeClothes() {
        clothes.makeClothes();
    }
}

最后,分别创建两个具体的装饰类,如下:

/**
 * 具体的装饰类
 */
public class EmbroideryDecorator extends Decorator {
    public EmbroideryDecorator(Clothes clothes) {
        super(clothes);
    }
    @Override
    public void makeClothes() {
        super.makeClothes();
        System.out.println("给衣服绣制花朵");
    }
}
/**
 * 具体的装饰类
 */
public class MickeyDecorator extends Decorator {
    public MickeyDecorator(Clothes clothes) {
        super(clothes);
    }
    @Override
    public void makeClothes() {
        super.makeClothes();
        System.out.println("给衣服绘制米老鼠图案");
    }
}

怎么用呢?请看下面的测试类:

/**
 * 客户端
 */
public class DecorateClient {
    public static void main(String[] args) {
        Clothes clothes = new MakeClothes();
        clothes = new EmbroideryDecorator(clothes);//给衣服绣花
        clothes = new MickeyDecorator(clothes);//给衣服添加米老鼠图案
        clothes.makeClothes();
        System.out.println("成品已经完成!");
    }
}

输出结果如下:

制作一件衣服
给衣服绣制花朵
给衣服绘制米老鼠图案
成品已经完成

从结果上,可以看到,我们成功的给MakeClothes这个类,动态添加了2个方法,一个是给衣服绣花,另一个是给衣服添加米老鼠图案,最后成品完成!

可见装饰的效果还不错~

三、应用

其实在 jdk  中,装饰者设计模式也有很多典型的场景应用,例如我们熟悉的io包中的字节输入、输出流,就用到了装饰者设计模式!

57.jpg58.jpg

其中FilterInputStreamFilterOutputStream就是装饰类,用于动态给输入、输出流增加方法!

四、总结

巧妙采用装饰器模式,可以很好的解决类继承数量过多的问题,让代码清晰可读。

但是如果装饰层数过多,也会影响到代码的维护,因此在实际的使用过程中,还需灵活使用!

目录
打赏
0
0
0
0
149
分享
相关文章
写代码原来如此简单:两种常用代码范式
一次项目包含非常多的流程,有需求拆解,业务建模,项目管理,风险识别,代码模块设计等等,如果我们在每次项目中,都将精力大量放在这些过程的思考上面,那我们剩余的,放在业务上思考的精力和时间就会大大减少;这也是为什么我们要 总结经验/方法论/范式 的原因;这篇文章旨在建立代码模块设计上的思路,给出了两种非常常用的设计范式,减少未来在这一块的精力开销。
代码之美:探索简洁性与可读性的平衡艺术
【9月更文挑战第31天】在编程的世界中,代码不仅是实现功能的工具,更是艺术的表现。本文将深入探讨如何通过简化和优化代码来达到高效、易维护的状态,同时保持其可读性。我们将从基础概念出发,逐步深入到实际案例分析,揭示简洁与可读性之间的微妙平衡,并分享一些实用的技巧和策略,帮助开发者在编写代码时能够更好地把握这一平衡点。
故意把代码写得很烂,这样的 “防御性编程“ 可取吗?
故意把代码写得很烂,这样的 “防御性编程“ 可取吗?
103 3
|
7月前
|
告别平庸!Python元类:让你的代码设计思想跃升至新高度
【7月更文挑战第7天】Python的元类是创建类的类,用于在定义时定制类的行为。通过元类,可以在类创建时注入逻辑,比如添加方法或改变属性。例如,一个元类可以自动为所有类添加日志功能。元类应用广泛,如自动注册类、修改属性、实现单例模式和动态添加方法,提升代码设计的灵活性和效率。掌握元类,让代码设计超越常规。
43 1
代码之美:简洁性与可读性的平衡艺术
【5月更文挑战第28天】在编程领域,"代码之美"是一个多维的概念,它不仅仅关乎逻辑的准确无误,还涉及到代码的表达形式和内在结构。本文探讨了如何在保持代码简洁性的同时,不牺牲其可读性,这是每位开发者都需面对的挑战。文章将通过具体的编程实践,阐述如何在这两者之间找到恰当的平衡点,并提出实用的策略和建议。
基础算法 - 常见算法模板题(最简洁写法)【下】
基础算法 - 常见算法模板题(最简洁写法)【下】
二十三种设计模式全面解析-探索解释器模式的高级应用和优化技巧:解锁代码解析的新境界
二十三种设计模式全面解析-探索解释器模式的高级应用和优化技巧:解锁代码解析的新境界

热门文章

最新文章