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

Spring 设计模式之装饰器模式

Spring 设计模式之装饰器模式

  • 装饰器模式
  • 用到的场景
  • 具体的java例子:

装饰器模式

装饰器模式允许我们在不修改原始类(即被装饰对象)的情况下,动态地向对象添加新的行为或修改现有行为。

用到的场景

存在一个原始类,在不改动原始类的基础上,新建一个类来继承原始类里面的方法或者改动这些方法,亦可增加独属于自己的方法。
简单来说就是以原始类为原型进行扩展

需要存在的核心类:
1.原始类
2.装饰器基类(抽象)
3.具体的装饰类

具体的java例子:

// 假设 Coffee 是一个接口,定义了咖啡的基本属性和方法  
public interface Coffee {String getDescription();double getCost();
}// 原始类;基本的咖啡实现  
class BasicCoffee implements Coffee {@Overridepublic String getDescription() {return "基础咖啡";}@Overridepublic double getCost() {return 2.0;}
}// 装饰器基类,持有对另一个 Coffee 对象的引用  
abstract class Decorator implements Coffee {protected Coffee coffee;public Decorator(Coffee coffee) {this.coffee = coffee;}@Overridepublic String getDescription() {return coffee.getDescription();}@Overridepublic double getCost() {return coffee.getCost();}
}// 具体的装饰器,添加牛奶  
class MilkDecorator extends Decorator {public MilkDecorator(Coffee coffee) {super(coffee);}@Overridepublic String getDescription() {return coffee.getDescription() + ",加牛奶";}@Overridepublic double getCost() {return coffee.getCost() + 0.5; // 假设加牛奶要额外0.5美元  }
}// 具体的装饰器,改描述、改价格
class GzDecorator extends Decorator {public GzDecorator(Coffee coffee) {super(coffee);}@Overridepublic String getDescription() {return "换描述了:GzDecorator";}@Overridepublic double getCost() {return 100; //}
}// 具体的装饰器,改描述、改价格
class TjDecorator extends Decorator {public TjDecorator(Coffee coffee) {super(coffee);}@Overridepublic String getDescription() {return "换描述了:TjDecorator";}@Overridepublic double getCost() {return 100; //}public String addSomethingSpecial() {return "我自己加的新方法哦...";}
}// 使用示例  
class Main {public static void main(String[] args) {// 创建一个基础咖啡对象  Coffee coffee = new BasicCoffee();  System.out.println("装饰前: " + coffee.getDescription() + " - $" + coffee.getCost());  // 第一个装饰器:加牛奶  coffee = new MilkDecorator(coffee);  System.out.println("加牛奶后: " + coffee.getDescription() + " - $" + coffee.getCost());  // 第二个装饰器:GzDecorator(换描述、换价格)  coffee = new GzDecorator(coffee);  System.out.println("GzDecorator装饰后: " + coffee.getDescription() + " - $" + coffee.getCost());  // 注意:这里我们不再将TjDecorator直接创建为TjDecorator coffee1,而是也作为coffee的一个装饰器  // 第三个装饰器:TjDecorator(换描述、换价格,并添加新方法)  coffee = new TjDecorator(coffee);  System.out.println("TjDecorator装饰后: " + coffee.getDescription() + " - $" + coffee.getCost()  + " " + ((TjDecorator) coffee).addSomethingSpecial()); // 需要强制类型转换来调用addSomethingSpecial()  }
}

输出结果

装饰前: 基础咖啡 - $2.0
装饰后: 基础咖啡,加牛奶 - $2.5
装饰后: 换描述了:GzDecorator - $100.0
装饰后: 换描述了:TjDecorator - $100.0 我自己加的新方法哦...

http://www.mrgr.cn/news/62012.html

相关文章:

  • 【计算机网络 - 基础问题】每日 3 题(五十九)
  • 【React】React 的核心设计思想
  • 【计算机网络教程】课程 章节测试1 计算机网络概述
  • 如何快速分析音频中的各种频率成分
  • 【flink】之kafka到kafka
  • 行为设计模式 -命令模式- JAVA
  • Unreal5从入门到精通之如何解决在VR项目在头显中卡顿的问题
  • 基于vue框架的的家政预定服务系统4k26i(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。
  • 万圣节活动如何实现在线预约报名?
  • uniapp iOS打包证书过期——重新下载证书及更新文件
  • 设计模式 - 工厂方法模式
  • Shell变量与子串
  • Mac程序坞窗口预览的方法来了
  • Rust 力扣 - 59. 螺旋矩阵 II
  • 为什么美业必须要有一套专业的美业门店管理系统?美业SaaS系统收银系统拓客系统Java源码
  • Django框架实现用户认证
  • 【力扣专题栏】两两交换链表中的节点,如何实现链表中两两相邻节点的交换?
  • 在JavaScript中怎样实现闭包?
  • 5、片元着色器之基础光照模型:Phong模型和Blinn-Phong模型
  • 【Linux】进程间通信
  • iOS18 取消/适配TabbarController缩放动画
  • Vue CLI: 安装、项目创建及基本概念指南,vue生命周期
  • C++:输入和输出
  • 《Linux系统编程篇》exec族函数——基础篇
  • MATLAB——入门知识
  • Vue3 学习笔记(十三)Vue组件详解