网站标题logo怎么做,广州牌手表网站,做网站开发需要考什么证书,电商网站怎么做微信支付目录 1. 说明2. 应用场景3. 结构图4. 构成5. 适用性6. 优点7. 缺点8. java示例 1. 说明
1.动态地给一个对象添加一些额外的职责。2.Decorator Pattern。3.就增加功能而言#xff0c;装饰器模式比生成子类更加灵活。4.一种在不改变现有对象结构的情况下#xff0c;动态地给对… 目录 1. 说明2. 应用场景3. 结构图4. 构成5. 适用性6. 优点7. 缺点8. java示例 1. 说明
1.动态地给一个对象添加一些额外的职责。2.Decorator Pattern。3.就增加功能而言装饰器模式比生成子类更加灵活。4.一种在不改变现有对象结构的情况下动态地给对象增加一些职责即增加额外功能的设计模式。5.属于对象结构型模式。
2. 应用场景
1.扩展功能当需要给某个对象添加额外的功能但又不想修改其源代码或结构时可以使用装饰器模式。例如在软件开发中可以使用装饰器模式来扩展类的功能而无需创建新的子类。2.动态代理装饰器模式允许在运行时动态地给对象添加或撤销功能。这对于需要动态修改对象行为的场景非常有用。3.缓存功能通过装饰器模式可以为对象添加缓存功能以提高系统的性能。例如可以在数据访问层使用装饰器模式来缓存数据减少对数据库的频繁访问。4.日志记录在系统中经常需要记录对象的操作历史或状态变化。通过装饰器模式可以轻松地给对象添加日志记录功能方便后续的调试和错误追踪。5.用户界面定制在图形用户界面GUI设计中可以使用装饰器模式来定制和扩展控件的功能。例如可以为按钮添加动画效果、改变样式或添加额外的交互功能。6.文件处理在处理文件时可以使用装饰器模式来添加各种文件处理功能如压缩、加密、解密等。这样用户可以根据需要选择不同的装饰器来处理文件。7.网络请求在发送网络请求时可以使用装饰器模式来添加各种请求处理功能如超时重试、身份验证、请求签名等。这些功能可以在不修改原始请求代码的情况下动态地添加到请求中。8.数据处理在处理数据时可以使用装饰器模式来添加各种数据处理功能如排序、过滤、转换等。这些功能可以根据需要动态地添加到数据处理流程中。
3. 结构图 4. 构成
1.Commponent抽象组件定义一个对象接口可以给这些对象动态地添加职责。定义一个接口或抽象类规定被装饰对象的行为。2.ConcreteComponent具体组件定义一个对象可以给这个对象添加职责。实现抽象组件接口或继承抽象组件类是装饰器模式中的原始对象。3.Decorator抽象装饰器维持一个指向Component对象的指针并定义一个与Component接口一致的接口。继承或实现抽象组件接口并持有一个指向抽象组件的引用。抽象装饰器通常还包含一些用于增加额外功能的方法。4.ConcreteDecorator具体装饰器向组件添加职责。继承抽象装饰器类并实现具体的额外功能。具体装饰器可以根据需要添加多个以实现不同的效果。
5. 适用性
1.在不影响其他对象的情况下以动态、透明的方式给单个对象添加职责。2.处理那些可以撤销的职责3.当不能采用生成子类的方式进行扩充时。一种情况是可能有大量独立的扩展为支持每一种组合将产生大量的子类使得子类数目呈爆炸性增长。另一种情况可能是由于类定义被隐藏或类定义不能用于生成子类。
6. 优点
1.灵活性装饰器是继承的有力补充比继承更加灵活。它可以在不改变原有对象的情况下动态地给一个对象扩展功能实现即插即用。2.可扩展性通过使用不同的装饰类以及这些装饰类的排列组合可以实现不同的效果满足不同的需求。3.遵循开闭原则装饰器模式在扩展功能时不需要修改原有类的代码符合开闭原则对扩展开放对修改关闭。
7. 缺点
1.增加复杂性装饰器模式会增加许多子类过度使用会增加程序的复杂性。2.难以理解如果装饰器类过多可能会使代码变得难以理解和维护。
8. java示例
1.抽象组件
package com.learning.decorator.person;/*** 抽象组件* 定义一个人的接口* 获取人的描述*/
public interface Person {String getDescription();
}2.具体组件
package com.learning.decorator.person;/*** 基础的人* 具体组件*/
public class BasePerson implements Person {/*** 人的姓名*/private String name; public BasePerson(String name) { this.name name; } Override public String getDescription() { return name; }
}3.抽象装饰器
package com.learning.decorator.person;/*** 抽象装饰器* 衣服装饰器*/
public abstract class ClothingDecorator implements Person {//被装饰的对象protected Person person; public ClothingDecorator(Person person) { this.person person; } Override public String getDescription() { return decorate(person.getDescription()); } protected abstract String decorate(String description);
}4.具体装饰器帽子装饰器
package com.learning.decorator.person;/*** 具体装饰器* 帽子装饰器*/
public class HatDecorator extends ClothingDecorator {public HatDecorator(Person person) { super(person); }/*** 帽子装饰,戴了一个帽子* param description* return*/Override protected String decorate(String description) { return description 戴了一个帽子;}
}5.具体装饰器围巾装饰器
package com.learning.decorator.person;/*** 具体装饰器* 毛巾装饰器*/
public class ScarfDecorator extends ClothingDecorator {public ScarfDecorator(Person person) { super(person); }/*** 覆盖父类的方法, 戴了一条围巾* param description* return*/Override protected String decorate(String description) { return description 戴了一条围巾;}
}6.客户端
package com.learning.decorator.person;public class Client {public static void main(String[] args) { Person person new BasePerson(张三);System.out.println(person.getDescription());Person personWithHat new HatDecorator(person);System.out.println(personWithHat.getDescription());Person personWithHatAndScarf new ScarfDecorator(personWithHat);System.out.println(personWithHatAndScarf.getDescription());}
}7.示例截图