网站首页的图片怎样做缓存,wordpress小工具开发教程,成都建站培训,网站建设及推广服务的合同范本系列文章目录 【设计模式】之模板方法模式 【设计模式】之责任链模式 【设计模式】之策略模式 【设计模式】之工厂模式#xff08;三种#xff09; 前言
今天给大家介绍23种设计模式中的装饰器模式。#x1f308;
一、什么是装饰器模式
装饰器模式#xff08;Decora…系列文章目录 【设计模式】之模板方法模式 【设计模式】之责任链模式 【设计模式】之策略模式 【设计模式】之工厂模式三种 前言
今天给大家介绍23种设计模式中的装饰器模式。
一、什么是装饰器模式
装饰器模式Decorator Pattern是一种结构型设计模式它允许你动态地给一个对象添加一些额外的职责。就增加功能来说装饰器模式相比生成子类更为灵活。
在装饰器模式中有一个抽象组件接口所有具体组件和装饰器都实现了这个接口。装饰器持有一个指向抽象组件的引用并通过递归的方式调用接口中的操作。每个装饰器都可以添加自己的功能同时调用所装饰的对象的操作。
二、装饰器模式的角色
Component抽象组件定义了一个对象的接口可以给这些对象动态地添加职责即方法ConcreteComponent具体组件实现了Component接口是装饰器要装饰的真实对象Decorator装饰器 持有一个指向Component对象的引用并有一个和Component接口一致的接口。它可以给组件添加额外的职责方法。通常包含对Component对象的引用以及实现Component接口的方法这些方法会调用Component接口中定义的操作并可能在其前后添加新的行为ConcreteDecorator具体装饰器实现了Decorator接口是装饰器接口的具体实现类 三、示例
定义一个抽象组件
public interface Person {Double cost();void show();
}具体组件
public class XiaoJie implements Person{Overridepublic Double cost() {return 0.0;}Overridepublic void show() {System.out.println(没穿衣服的小杰。);}
} 定义装饰器
public abstract class ClothesDecorator implements Person{protected Person person;public ClothesDecorator(Person person) {this.person person;}
} 具体装饰器
public class Shirt extends ClothesDecorator{public Shirt(Person person) {super(person);}Overridepublic Double cost() {return this.person.cost()500;}Overridepublic void show() {this.person.show();System.out.println(买了一个体恤累计消费 this.cost() 元);}
}public class Jeans extends ClothesDecorator{public Jeans(Person person) {super(person);}Overridepublic Double cost() {return this.person.cost()200.0;}Overridepublic void show() {this.person.show();System.out.println(买了一条牛仔裤累计消费this.cost()元);}
}public class Shoes extends ClothesDecorator{public Shoes(Person person) {super(person);}Overridepublic Double cost() {return this.person.cost()1000.0;}Overridepublic void show() {this.person.show();System.out.println(买了一双鞋一共消费this.cost()元);}
}
测试
public class test {public static void main(String[] args) {Person xiaoJie new XiaoJie();xiaoJie new Shirt(xiaoJie);xiaoJie new Jeans(xiaoJie);xiaoJie new Shoes(xiaoJie);xiaoJie.show();System.out.println(本次一共消费xiaoJie.cost()元);}
}
/*
测试结果没穿衣服的小杰。
买了一个体恤累计消费500.0元
买了一条牛仔裤累计消费700.0元
买了一双鞋一共消费1700.0元
本次一共消费1700.0元*/ 四、应用场景 扩展类的功能当需要给一个已经存在的类添加新的功能但又不想通过继承来生成子类时可以使用装饰器模式。这是因为继承会增加类的层次结构可能导致类的数量爆炸式增长而装饰器模式可以在不改变原有类结构的情况下动态地给对象添加新的功能。动态添加和撤销功能装饰器模式允许在运行时动态地给对象添加新的功能并且这些功能也可以动态地被撤销。这对于那些需要经常变化或需要灵活配置的功能来说非常有用。为一组相似的类添加功能如果有一组相似的类它们都需要添加相同的功能但是又不希望修改这些类的源代码那么可以使用装饰器模式。通过为这些类创建一个统一的接口或抽象类并创建一个装饰器类来包装这些类的对象就可以在保持原有类结构不变的情况下为这些类添加新的功能。处理透明性和递归组合装饰器模式可以透明地添加或撤销功能这意味着用户在使用被装饰的对象时不需要知道对象是否被装饰过。此外装饰器模式还可以实现递归组合即一个装饰器可以包含另一个装饰器从而创建出更复杂的功能组合。 在实际应用中装饰器模式可以用于许多场景例如
在图形界面库中可以使用装饰器模式来动态地改变控件的外观或行为。在网络编程中可以使用装饰器模式来添加日志记录、性能监控等功能到现有的网络请求或响应对象中。在游戏开发中可以使用装饰器模式来扩展游戏角色的能力或属性。在Web应用中可以使用装饰器模式来动态地添加或撤销用户的权限或角色。
总之装饰器模式是一种非常灵活和强大的设计模式它可以在不改变现有类结构的情况下动态地给对象添加新的功能或职责。
五、总结
优点 动态扩展装饰器模式允许在运行时动态地给一个对象添加新的功能或职责而无需修改其原有结构。这使得代码更加灵活和可扩展。 高内聚低耦合通过组合而非继承来扩展对象的功能有助于保持类的职责单一实现高内聚。同时由于装饰器与被装饰对象之间通过接口或抽象类进行交互降低了它们之间的耦合度。 透明性对于使用装饰器模式的客户端代码来说装饰过的对象与未装饰的对象在接口上是一致的因此可以透明地使用装饰过的对象。客户端无需知道对象是否被装饰过也无需关心装饰的具体细节。 灵活性装饰器模式允许在运行时通过组合不同的装饰器来创建具有不同功能组合的对象。这使得可以根据需要灵活地定制对象的行为。 缺点 可能产生较多的对象由于装饰器模式是通过组合多个装饰器来扩展对象的功能的因此在使用时可能会产生较多的对象。这可能会导致内存占用增加和性能下降的问题。 对装饰器的要求装饰器需要与被装饰对象具有相同的接口或抽象类。如果接口或抽象类发生变化可能需要修改所有的装饰器。这可能会增加维护成本。 可能导致设计过度复杂化如果过度使用装饰器模式可能会导致设计过度复杂化。过多的装饰器类和接口可能会使代码难以理解和维护。 递归调用在某些情况下装饰器可能会递归地调用自身或其他装饰器。这可能会导致无限递归或栈溢出的问题需要特别注意。 总结
今天的分享就到这里我们下期再见✋