惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
aimingoo的专栏
aimingoo的专栏
月光博客
月光博客
博客园 - Franky
Martin Fowler
Martin Fowler
U
Unit 42
阮一峰的网络日志
阮一峰的网络日志
Recent Announcements
Recent Announcements
The Cloudflare Blog
博客园 - 聂微东
酷 壳 – CoolShell
酷 壳 – CoolShell
宝玉的分享
宝玉的分享
J
Java Code Geeks
B
Blog RSS Feed
博客园 - 三生石上(FineUI控件)
MongoDB | Blog
MongoDB | Blog
腾讯CDC
博客园_首页
博客园 - 司徒正美
D
DataBreaches.Net
I
InfoQ
GbyAI
GbyAI
IT之家
IT之家
罗磊的独立博客

牛牛技术客栈

设计模式-备忘录模式 - OXOXTECH 牛牛技术客栈 设计模式-中介者模式 - OXOXTECH 牛牛技术客栈 Linux【Ubuntu】修改ssh默认端口 - OXOXTECH 牛牛技术客栈 设计模式-迭代器模式 - OXOXTECH 牛牛技术客栈 scheduled定时任务的三种基本实现方式 - OXOXTECH 牛牛技术客栈 Apriori - 基于关联规则的推荐算法(三) - OXOXTECH 牛牛技术客栈 Apriori - 基于关联规则的推荐算法(二) - OXOXTECH 牛牛技术客栈 Apriori - 基于关联规则的推荐算法(一) - OXOXTECH 牛牛技术客栈 基于JavaFX的桌面端网络调试工具 - OXOXTECH 牛牛技术客栈 Golang Channel的原理介绍 - OXOXTECH 牛牛技术客栈 Go语言Map的原理分析 - OXOXTECH 牛牛技术客栈 Go语言错误处理(panic)的最佳实践 - OXOXTECH 牛牛技术客栈 设计模式-解释器模式 - OXOXTECH 牛牛技术客栈 Redis报错Redis is configured to save RDB snapshots, but it's currently unable to persist to disk. go-webpbin库在Linux报错failed to encode image to WebP: exit status 1.......的问题 exe4j 打包加密的jar - OXOXTECH 牛牛技术客栈 Go生成图形验证码示例 - OXOXTECH 牛牛技术客栈 澳门一天游:一日尽享东方与西方的交融之美 - OXOXTECH 牛牛技术客栈 设计模式-命令模式 - OXOXTECH 牛牛技术客栈 别再自己瞎写工具类了,SpringBoot内置工具类应有尽有 - OXOXTECH 牛牛技术客栈 中山一日游 - OXOXTECH 牛牛技术客栈 设计模式-责任链模式 - OXOXTECH 牛牛技术客栈 起舞吧,齐舞吧 - OXOXTECH 牛牛技术客栈 设计模式-组合模式 - OXOXTECH 牛牛技术客栈 Go语言Web开发|GoFrame框架入门笔记 - OXOXTECH 牛牛技术客栈 Java打包exe教程 - OXOXTECH 牛牛技术客栈 设计模式-代理模式 - OXOXTECH 牛牛技术客栈 MySQL存储过程的优缺点有哪些? - OXOXTECH 牛牛技术客栈 前端渲染优化有哪些? - OXOXTECH 牛牛技术客栈 HTTP状态码及其含义 - OXOXTECH 牛牛技术客栈
设计模式-装饰器模式 - OXOXTECH 牛牛技术客栈
Jensen · 2024-03-13 · via 牛牛技术客栈

设计模式-装饰器模式

Jensen Java Java, 设计模式

前言

Java开发中,设计模式是常用的一种编码方式,合理使用设计模式可以帮助开发人员更快地编写出高效、可靠和可维护的代码。本期将撰写一个关于设计模式的系列文章,总共23种设计模式将以一篇一篇文章讲解,代码笔记已开源至:Gitee点击跳转。在上一篇《Java设计模式(6)桥接模式》文章中,我们介绍了桥接模式。本文是这个系列的第七篇章,我们将讲解一下装饰器模式的实现方式、应用场景以及它的用途。

装饰器模式

装饰器模式是一种结构型设计模式,用于动态地为对象添加额外的行为或责任,而无需修改其原始类。它允许将对象包装在一系列装饰器中,每个装饰器都添加一些特定的功能,从而实现对对象行为的灵活扩展。

使用场景

  1. 当需要动态地为对象添加额外的功能或行为,而不希望修改原始类的代码时,可以使用装饰器模式
  2. 当需要为对象的不同组合添加功能时,通常会创建大量的子类,这样会导致类的层次结构变得庞大和复杂。使用装饰器模式可以避免创建大量的子类,而是通过组合不同的装饰器来实现各种功能组合。

代码实现

这里采用绘图的例子来讲解一下此模式的代码实现。首先是定义一个Shape接口,里边有个draw()方法,表示绘制图形的操作

/**
 * 形状接口
 * @author Jensen
 * @date 2024-01-18
 * */
public interface Shape {
    void draw();
}

随后创建一个圆形Circle实现类,表示画一个圆

/**
 * 圆圈
 * @author Jensen
 * @date 2024-01-18
 * */
public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("默认色的圆圈");
    }
}

此时,我们再创建一个装饰器ShapeDecorator类,并实现了Shape,还包含一个 Shape 类型的变量 shape,表示要装饰的对象。

/**
 * 形状装饰抽象类
 * @author Jensen
 * @date 2024-01-18
 * */
public abstract class ShapeDecorator implements Shape{
    protected Shape shape;

    public ShapeDecorator(Shape shape) {
        this.shape = shape;
    }
    public void draw(){
        shape.draw();
    }
}

现在,我们还要创建一个GreenShapeDecorator类,GreenShapeDecorator类是一个具体装饰器类,继承了ShapeDecorator,并实现了draw()具体,在绘制图形时涂上了一个绿色

public class GreenShapeDecorator extends ShapeDecorator {
    public GreenShapeDecorator(Shape shape) {
        super(shape);
    }
    @Override
    public void draw(){
        shape.draw();
        System.out.println("涂的颜色是:绿色");
    }
}

这样,我们就完成了装饰器的基本逻辑

测试使用

首先我们画一个普通的圆形,然后再给圆形加上绿色

System.out.println("------------------------------装饰器模式-----------------------------");
Circle circle = new Circle();
System.out.println("装饰前的:");
circle.draw();
System.out.println("====================");
System.out.println("给形状上色:");
GreenShapeDecorator greenShapeDecorator = new GreenShapeDecorator(circle);
greenShapeDecorator.draw();

image.png

结语

在实际应用中,装饰器模式经常用于图形界面(GUI)开发、输入/输出流处理、缓存机制、日志记录等领域,可以有效地提高程序的可扩展性和可维护性。比如 Java Swing 组件是一个经典的装饰器模式的例子。它允许在运行时动态地向组件添加功能,如边框、背景、文本等等。可以使用 BorderFactory 来向组件添加边框,使用 Color 来设置组件的背景颜色,使用 Font 来设置组件的字体等等。