8.装饰者模式

news2024/11/16 1:20:09

目录

简介

角色组成

实现步骤

1. 新建 Log.class,添加如下代码

2. 新建 Log4j.class,继承 Log.class,并实现 record() 方法

3. 新建 Decorator.class,继承 Log.class

4. 新建 Log4jDecorator.class,继承 Decorator.class,添加扩展功能

5. 测试一下,可对比使用装饰器之前和使用装饰器之后的效果


简介

装饰器模式(Decorator Pattern)也称为包装模式(Wrapper Pattern) 是指在不改变原有对象的基础之上,将功能附加到对象上,提供了比继承更有弹性的替代方案(扩展原有对象的功能),属于结构型模式;装饰器模式的核心是功能扩展,使用装饰器模式可以透明且动态地扩展类的功能

角色组成

 

1. Log:抽象类(也可以是接口),其充当被装饰类的原始对象,规定了被装饰对象的行为

2. Log4j:被装饰的对象,需要继承 Log 抽象类,并实现具体的方法

3. Decorator:装饰器抽象类,内部必然有一个属性指向 Log 抽象组件;其实现一般是一个抽象类,主要是为了让其子类按照其构造形式传入一个 Log 抽象组件,这是强制的通用行为

4. Log4jDecorator:具体的装饰类,继承 Decorator 抽象类,并对 Log 进行增强逻辑

实现步骤

1. 新建 Log.class,添加如下代码

/**
 * 顶层抽象父类
 */
public abstract class Log {
    // 定义记录日志的方法
    public abstract void record();
}

2. 新建 Log4j.class,继承 Log.class,并实现 record() 方法

/**
 * 具体的日志记录插件 
 */
public class Log4j extends Log {
    @Override
    public void record() {
        System.out.println("使用 log4j 记录日志");
    }
}

3. 新建 Decorator.class,继承 Log.class

/**
 * 装饰器
 */
public abstract class Decorator extends Log {
    private Log log;
	
    public Decorator(Log log) {
        this.log = log;
    }

    @Override
    public void record() {
        log.record();
    }
}

4. 新建 Log4jDecorator.class,继承 Decorator.class,添加扩展功能

/**
 * Log4j 增强类
 */
public class Log4jDecorator extends Decorator {
    public Log4jDecorator(Log log) {
        super(log);
    }

    @Override
    public void record() {
        System.out.println("日志记录之前...");
        super.record();
        System.out.println("日志记录之后 ...");
    }
}

5. 测试一下,可对比使用装饰器之前和使用装饰器之后的效果

public static void main(String[] args) {
    Log log = new Log4j();
    log.record();
	
    System.out.println("---------------------");
	
    log = new Log4jDecorator(log);
    log.record();
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/391099.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java Web 实战 03 - 多线程基础(2)

Java Web 实战 03 - 多线程基础篇 2二 . Thread类常见方法2.1 Thread 的常见构造方法2.2 Thread 的几个常见属性getId()getName()getState()getPriority()isDaemon()案例 : 实现 getId()、getName()、 getState()、getPriority()、isDaemon()、isAlive()2.3 启动一个线程-start…

redis反序列化问题 missing type id property ‘@class‘

Caused by: com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Missing type id when trying to resolve subtype of [simple type, class java.lang.Object]: missing type id property class刚开始使用的是Jackson2JsonRedisSerializer保存的时候没问题&#xff0…

基于Java+SpringBoot+Vue+Redis+RabbitMq的鲜花商城

基于JavaSpringBootVueRedisRabbitMq的鲜花商城 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、…

制造型企业想要做好数字化改造,要注意以下几点!

很多企业在“工业4.0、智能制造、互联网”等概念满天飞的环境下迷失了方向,不知该如何下手,盲目跟风,看别人投自动化,自己也跟着投,看别人上信息化,自己也跟着上。 其实,智能制造也好&#xff…

网络基础(二)之TCP/UDP协议

目录 传输层 再谈端口号 端口号范围划分 认识知名端口号(Well-Know Port Number) 两个问题 pidof netstat UDP协议 UDP协议端格式 对于16位UDP长度的理解 UDP如何做到封装和解包的? UDP如何做到向上交付(分用问题)? 我们写代码的时候为什么…

OceanBase 第六期技术征文活动|小鱼还能“更快”吗?你来试试

2022 年 8 月 10 日,我们在 OceanBase 年度发布会上正式发布了 OceanBase 4.0(代号:小鱼),并在现场展区尝试做了一些有趣的事情,“小鱼”可以单机版部署在个人 PC 以及树莓派,让来到现场的开发者…

项目管理中,导致进度失控的五种错误

项目管理中对工期的控制主要是进度控制,在项目进行中中,由于项目时间跨度长,人员繁杂,如果管理不规范,就容易导致项目进度滞后,如何管理好施工进度是管理者需要解决的问题之一。 1、项目计划缺乏执行力 安…

Allegro如何设通孔Pin和Via的消盘操作指导

Allegro如何设通孔Pin和Via的消盘操作指导 用Allegro做PCB设计的时候,除了可以在光绘设置里面设置内层通孔Pin和Via的消盘,在设计过程中,同样也可以设置消盘效果,以便实时显示,如下图 如何设置,具体操作如下 点击Setup点击Unused Pads Suppression

BigInteger类和BigDecimal类的简单介绍

文章目录📖前言:🎀BigInteger类和BigDecimal类的由来🎀BigDecimal类的优点🎀BigDecimal类容易引发的错误🏅处理方法📖前言: 本篇博客主要介绍BigInteger类和BigDecimal类的用途及常…

C语言-基础了解-10-C函数

C函数 一、C函数 函数是一组一起执行一个任务的语句。每个 C 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数。 您可以把代码划分到不同的函数中。如何划分代码到不同的函数中是由您来决定的,但在逻辑上&…

Greenplum-MVCC与数据可见性判断

众所周知,Greenplum内部支持MVCC多版本并发控制,通过MVCC技术,可以支持同一行数据的读写并发问题,从而大大提升并发访问控制的能力。 GP中的MVCC实现 所谓多版本,其含义在于数据的更新和删除操作并不是直接在原数据上…

Web Spider案例 网洛克 第四题 JSFuck加密 练习(八)

声明 此次案例只为学习交流使用,抓包内容、敏感网址、数据接口均已做脱敏处理,切勿用于其他非法用途; 文章目录声明一、资源推荐二、逆向目标三、抓包分析 & 下断分析逆向3.1 抓包分析3.2 下断分析逆向拿到混淆JS代码3.3 JSFuck解决方式…

Javaweb第一个项目——实现简单的登陆功能

第一步:打开idea-->文件-->新建 第二步: 在Demo文件夹 点击右键-->添加框架支持-->找到Web应用程序 勾选 第三步:配置Tomcat 第四步:新建一个lib(建在web-INF文件夹下)文件夹 用于存放jar包…

ubuntu安装cuda11.7

wget https://developer.download.nvidia.com/compute/cuda/11.7.0/local_installrs/cuda_11.7.0_515.43.04_linux.runsudo sh cuda_11.7.0_515.43.04_linux.run在驱动项回车取消,因为我们已经安装了驱动了。 Installed in /usr/local/cuda-11.7/配置环境变量&…

线上负载过高排查(top/vmstat/ifstat/free/df)

目录 一、五大命令 二、故障排查步骤 1、top命令找出CPU占比最高的 2、ps -ef 或者 jps -l进一步定位 3、ps -mp位到具体线程或者代码 4、jstack精准定位到错误的地方 本文通过学习:周阳老师-尚硅谷Java大厂面试题第二季 总结的LinuxJDK命令操作相关的笔记 一…

PowerShell 实现企业微信机器人推送消息

前言企业微信机器人 在ARMS告警管理中创建企业微信机器人后,您可以在通知策略中指定对应的企业微信群用于接收告警。当通知策略的匹配规则被触发时,系统会自动向您指定的企业微信群发送告警通知。企业微信群收到通知后,您可以在企业微信群中…

【Docker】如何在内网快速搭建docker并安装Oracle11g

文章目录前言一、下载docker静态二进制存档二、将解压完的二进制文件移到可执行文件目录下三、配置docker.service四、启动dockerd服务五、在有网络的环境生成Oracle11g镜像并导入5.1下载镜像Oracle11g镜像5.2将镜像打包5.3将镜像导入六、docker安装oracle11g6.1启动镜像6.2宿主…

JavaSE学习笔记总结day18

今日内容 零、 复习昨日 一、作业 二、进程与线程 三、创建线程 四、线程的API 五、线程状态 六、线程同步 零、 复习昨日 晨考 一、作业 见答案 二、进程与线程[了解] 一个进程就是一个应用程序,进程包含线程 一个进程至少包含一个线程,大部分都是有多条线程在执行任务(多线…

【项目】视频点播系统

目录一、项目介绍1. 对视频点播系统的认识2. 服务端功能模块划分二、环境搭建2.1 升级GCC2.2 安装JsonCpp库2.3 引入httplib库2.4 MySQL数据库及开发包安装三、第三方库的认识3.1 认识JsonCpp3.2 JsonCpp实现序列化3.3 JsonCpp实现反序列化3.4 认识MySQL数据库的API3.5 使用MyS…

JS 异步接口调用介绍

JS 异步接口调用介绍 Js 单线程模型 JavaScript 语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。这样设计的方案主要源于其语言特性,因为 JavaScript 是浏览器脚本语言,它可以操纵 DOM ,可以渲染动画&a…