java装饰器模式
意图:动态的将责任附加到对象上
什么时候使用:
1.在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责
2.处理那些可以撤销的职责
3.当不能采用生成子类的方式进行扩充时
结构图:
示例代码:
1 package com.test.patten.decorator; 2 3 public interface Person { 4 void doCoding(); 5 }
1 package com.test.patten.decorator; 2 3 public class Employee implements Person { 4 5 @Override 6 public void doCoding() { 7 System.out.println("程序员加班写程序啊,写程序,终于写完了。。。"); 8 } 9 10 }
1 package com.test.patten.decorator; 2 3 public abstract class Manager implements Person{ 4 5 //装饰器增加功能 6 public abstract void doCoding(); 7 8 }
1 package com.test.patten.decorator; 2 3 public class ManagerA extends Manager { 4 private Person person;//给雇员升职 5 6 public ManagerA(Person person) { 7 super(); 8 this.person = person; 9 } 10 @Override 11 public void doCoding() { 12 doEarlyWork(); 13 person.doCoding(); 14 } 15 /** 16 * 项目经理开始前期准备工作 17 */ 18 public void doEarlyWork() { 19 System.out.println("项目经理A做需求分析"); 20 System.out.println("项目经理A做架构设计"); 21 System.out.println("项目经理A做详细设计"); 22 } 23 }
1 package com.test.patten.decorator; 2 3 public class ManagerB extends Manager { 4 private Person person;//给雇员升职 5 6 public ManagerB(Person person) { 7 super(); 8 this.person = person; 9 } 10 @Override 11 public void doCoding() { 12 person.doCoding(); 13 doEndWork(); 14 } 15 /** 16 * 项目经理开始项目收尾工作 17 */ 18 public void doEndWork() { 19 System.out.println("项目经理B 在做收尾工作"); 20 } 21 22 }
测试一下:
1 package com.test.patten.decorator; 2 3 public class Client { 4 public static void main(String args[]){ 5 Person employee = new Employee(); 6 employee = new ManagerA(employee);//赋予程序猿项目经理A职责 7 employee = new ManagerB(employee);//赋予程序猿项目经理B职责 8 9 employee.doCoding(); 10 } 11 }
项目经理A做需求分析 项目经理A做架构设计 项目经理A做详细设计 程序员加班写程序啊,写程序,终于写完了。。。 项目经理B 在做收尾工作 |
实际应用中的例子:java i/o
应用到的设计原则:对扩展开放,对修改关闭
优缺点:
1.装饰者类反应出被装饰的组件类型
2.装饰者类可以在被装饰者的行为前面或后面加上自己的行为,甚至取代被装饰者的行为,达到特定的目的
3.可以用无数个装饰者包装一个组件,装饰者类会导致设计中出现许多小对象,过度使用会让程序变的复杂
4.装饰者一般对组件的客户是透明的,除非客户程序依赖于组件的具体类型
==========================================================
踏踏实实做事,健健康康生活=========================================================
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!