当前位置: 首页 > news >正文

Java装饰器模式,装饰器模式通常通过创建一个接口和一个或多个实现了该接口的类来开始,然后创建装饰器类,这些类也实现了相同的接口

1、定义一个接口Component

public interface Component {  void operation();  
}

2、创建一个实现了Component接口的简单类SimpleComponent

public class SimpleComponent implements Component {  @Override  public void operation() {  System.out.println("SimpleComponent operation.");  }  
}

3、创建一个装饰器基类Decorator,它也实现了Component接口,并持有一个对Component对象的引用

public abstract class Decorator implements Component {  protected Component component;  public Decorator(Component component) {  this.component = component;  }  @Override  public void operation() {  if (component != null) {  component.operation();  }  }  
}

4、创建一个具体的装饰器类,例如ConcreteDecoratorA,它添加了一些额外的功能

public class ConcreteDecoratorA extends Decorator {  public ConcreteDecoratorA(Component component) {  super(component);  }  @Override  public void operation() {  super.operation(); // 调用被装饰对象的operation方法  addedFunctionA(); // 添加额外的功能A  }  private void addedFunctionA() {  System.out.println("ConcreteDecoratorA added function.");  }  
}

5、编写一个测试类来展示如何使用装饰器

public class DecoratorPatternDemo {  public static void main(String[] args) {  // 创建一个简单组件  Component simpleComponent = new SimpleComponent();  // 使用装饰器A装饰简单组件  Component decoratedComponent = new ConcreteDecoratorA(simpleComponent);  // 调用被装饰后的组件的operation方法  decoratedComponent.operation();  }  
}

在这里插入图片描述

相关文章:

  • MC联机无法连接到服务器怎么解决
  • 【WRF理论第二期】运行模型的基础知识
  • 路由懒加载
  • VL27 不重叠序列检测
  • harbor -- docker私有仓库安装配置
  • 基于SpringBoot+Vue二手家电管理平台设计和实现(源码+LW+调试文档+讲解等)
  • 【再探】Java—Java 沙箱机制与类加载器
  • STM32远程更新
  • Docker的部署与基本使用
  • $nextTick的使用场景介绍
  • Python使用rosbag使用getattr只能获取一层的数据,不能直接获取多层数据例如 a.b.c.d。使用for range写一个递归用来获取多层数据
  • SmartEDA:革新电路设计,体验前所未有的创新乐趣!
  • CVE-2022-4230
  • 【TB作品】MSP430F149 单片机 音乐喷泉
  • Spring Cloud工程添加子模块打包后文件为war包而非jar包
  • 【译】JS基础算法脚本:字符串结尾
  • @jsonView过滤属性
  • [case10]使用RSQL实现端到端的动态查询
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • JavaScript异步流程控制的前世今生
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • Java基本数据类型之Number
  • js递归,无限分级树形折叠菜单
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • Spring声明式事务管理之一:五大属性分析
  • TCP拥塞控制
  • underscore源码剖析之整体架构
  • uva 10370 Above Average
  • 如何胜任知名企业的商业数据分析师?
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 新书推荐|Windows黑客编程技术详解
  • 以太坊客户端Geth命令参数详解
  • 用 Swift 编写面向协议的视图
  • raise 与 raise ... from 的区别
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​Linux·i2c驱动架构​
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (CVPRW,2024)可学习的提示:遥感领域小样本语义分割
  • (NSDate) 时间 (time )比较
  • (Ruby)Ubuntu12.04安装Rails环境
  • (代码示例)使用setTimeout来延迟加载JS脚本文件
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (六)Hibernate的二级缓存
  • (十六)Flask之蓝图
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • .mysql secret在哪_MYSQL基本操作(上)
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .Net多线程Threading相关详解
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理
  • /etc/fstab和/etc/mtab的区别
  • [APUE]进程关系(下)