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

设计模式(7):装饰器模式

一.装饰器模式职责:

  • 动态的为一个对象增加新的功能;
  • 装饰器是一种用于代替继承的技术,无须通过继承增加子类就能扩展对象的新功能,使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀。

二.装饰器模式优点:

  • 扩展对象功能比较灵活,不会导致类个数急剧增加;
  • 可以对一个对象进行多次装饰,创作出不同行为的组合,得到功能更加强大的对象;
  • 具体构建类和具体装饰类可以独立变化,用户可以根据需要自己增加新的具体构建子类和具体装饰子类。

三.装饰器模式缺点:

  • 产生很多小对象,大量小对象占据内存,一定程度上影响性能;
  • 装饰模式易于出错,调试排查比较麻烦。

四.装饰器模式总结:

  • 装饰器模式也叫包装器模式
  • 装饰器模式降低系统的耦合度,可以动态的增加或删除对象的职责,并使得需要装饰的具体构建类和具体装饰类可以独立变化,以便增加新的具体构建类和具体装饰类。

五.代码实现

  • 1.抽象组件

/*** 抽象组件角色*/
public interface ICar {/*** 移动*/void move();
}
  • 2.具体组件角色

/*** 具体组件角色(真实角色)*/
public class Car implements ICar{@Overridepublic void move() {System.out.println("陆地跑。。。。");}
}
  • 3.装饰器角色

/*** 装饰器角色*/
public class SuperCar implements ICar{public ICar car;public SuperCar(ICar car) {this.car = car;}@Overridepublic void move() {car.move();}
}
  • 4.具体装饰器角色

/*** 天上飞。。。。*/
public class flyCar extends SuperCar{public flyCar(ICar car) {super(car);}public void fly(){System.out.println("天上飞。。。。");}@Overridepublic void move() {super.move();fly();}
}
/*** 水中游。。。。*/
public class WaterCar extends SuperCar{public WaterCar(ICar car){super(car);}public void swim(){System.out.println("水中游。。。。");}@Overridepublic void move() {super.move();swim();}
}
/*** 自动跑。。。。*/
public class IDCar extends SuperCar{public IDCar(ICar car) {super(car);}public void autoMove(){System.out.println("自动跑。。。。");}@Overridepublic void move() {super.move();autoMove();}
}
  • 5.装饰器调用

/*** 装饰器模式*/
public class App {public static void main(String[] args) {Car car=new Car();car.move();System.out.println("=======添加新功能:飞。。。。");flyCar fly=new flyCar(car);fly.move();System.out.println("=======添加新功能:飞、。。。。游、、、、");WaterCar water=new WaterCar(fly);water.move();}
}



更多设计模式学习:

          设计模式(1):介绍
          设计模式(2):单例模式
          设计模式(3):工厂模式
          设计模式(4):建造者模式
          设计模式(5):原型模式
          设计模式(6):桥接模式
          设计模式持续更新中…

http://www.lryc.cn/news/328096.html

相关文章:

  • Flink SQL填坑记3:两个kafka数据关联查询
  • 移动平台实时动态多点光源方案:Cluster Light
  • 2024年03月CCF-GESP编程能力等级认证C++编程八级真题解析
  • (十一)图像的罗伯特梯度锐化
  • 实验九 枚举问题(运算模拟)
  • 2024 年 AI 辅助研发趋势:从研发数字化到 AI + 开发工具 2.0,不止于 Copilot
  • UE5数字孪生系列笔记(三)
  • ASR-LLM-TTS 大模型对话实现案例;语音识别、大模型对话、声音生成
  • 主干网络篇 | YOLOv8更换主干网络之EfficientNet
  • Web开发-Django学习笔记
  • 关于深度学习的 PyTorch 项目如何上手分析?从什么地方切入?
  • JavaEE企业开发新技术4
  • CSS使用JS变量
  • 拆分巨石:将MVPS和MVAS应用于遗留应用程序——可持续架构(六)
  • Linux renice命令教程:如何优雅地调整进程优先级(附案例详解和注意事项)
  • Gitea 的详细介绍
  • Kotlin object
  • 【Redis】数据类型、事务执行、内存淘汰策略
  • Python Flask Web框架初步入门
  • 【设计模式】工厂方法模式详解
  • 独立游戏《星尘异变》UE5 C++程序开发日志3——UEC++特供的数据类型
  • 递归方法的理解
  • css之flex布局文本不换行不显示省略号的解决方法
  • 华清远见STM32U5开发板助力2024嵌入式大赛ST赛道智能可穿戴设备及IOT选题项目开发
  • 若依框架实现不同端用户登录(后台管理用户和前台会员登录——sping security多用户)
  • 【解決|三方工具】Obi Rope 编辑器运行即崩溃问题
  • 岭师大数据技术原理与应用-序章-软工版
  • Leetcode 680. 验证回文串 II
  • 网络安全接入认证-802.1X接入说明
  • iPhone的iOS系统:定义移动智能体验,引领科技潮流之巅