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.装饰者一般对组件的客户是透明的,除非客户程序依赖于组件的具体类型

posted @   Gnight  阅读(10180)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
点击右上角即可分享
微信分享提示