设计模式-装饰模式
设计模式-装饰模式
B1n_装饰模式是一种结构型设计模式,它允许向一个现有的对象添加新的功能,同时又不改变其结构。这种模式就像是给对象穿衣服,可以动态地添加和移除功能,而无需修改对象的代码。
装饰模式的结构:
- 抽象组件: 定义了对象的基本功能。
- 具体组件: 实现抽象组件定义的功能。
- 装饰器: 负责为具体组件添加新的功能。
- 装饰具体组件: 将装饰器和具体组件组合在一起,形成新的对象。
装饰模式的优点:
- 灵活性: 可以动态地添加和移除功能,无需修改对象的代码。
- 可扩展性: 可以方便地添加新的装饰器,扩展对象的的功能。
- 代码复用: 可以将通用的功能抽取到装饰器中,避免代码重复。
把类中的装饰功能从类中搬移去除,这样可以简化原有的类。
有效地把类的核心职责和装饰功能区分开了。而且可以去除相关类中重复的装饰逻辑(比如先打八折再满300返100和先满300返100再打八折这种需要在策略模式中写两个类但是代码十分重复的情况)
装饰模式的应用场景:
- 需要在不改变原有代码的情况下扩展对象功能的场景。
- 需要动态地添加和移除对象功能的场景。
- 需要对对象功能进行分层控制的场景。
当系统需要新功能的时候,是向旧的类中添加新的代码。这些新家的代码通常装饰了原有类的核心职责或主要行为,比如加糖、加奶油来装饰咖啡,这种做法的问题在于,它们在主类中加入了新的字段,新的方法和新的逻辑,从而增加了主类的复杂度,就像一开始起初的一杯咖啡,而这些新加入的东西仅仅是为了满足一些只在某种特定情况下才会执行的特殊行为的需要。而装饰模式却提供了一个非常好的解决方案,它把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,因此,当需要执行特殊行为时,客户代码就可以在运行时根据需要有选择地、按顺序地使用装饰功能包装对象。
输出结果:
在这个例子中,Coffee 是抽象组件,PlainCoffee 是具体组件,CoffeeDecorator 是装饰器,MilkCoffeeDecorator 和 SugarCoffeeDecorator 是具体装饰器。
我们可以看到,通过使用装饰模式,我们可以很方便地为 PlainCoffee 对象添加 “加奶” 和 “加糖” 功能,而无需修改 PlainCoffee 类的代码。
装饰模式的注意事项:
- 装饰模式会增加对象的复杂度。
- 过度使用装饰模式会导致代码难以理解和维护。
总结:
装饰模式是一种非常有用的设计模式,它可以让我们在不改变原有代码的情况下扩展对象功能。但是,我们也需要注意装饰模式的缺点,避免过度使用。
1 | // 抽象组件 |
1 | 制作普通咖啡 |
比较装饰模式和开放-封闭原则
装饰模式与开放-封闭原则相比,具有以下优势:
- 灵活性更强: 装饰模式可以动态地添加和移除功能,而开放-封闭原则要求代码对扩展开放,但对修改封闭,因此在需要对现有代码进行重大修改时,装饰模式更加灵活。
- 代码复用性更好: 装饰模式可以将通用的功能抽取到装饰器中,避免代码重复,而开放-封闭原则则没有这方面的要求。
当然,装饰模式也有一些缺点,例如会增加对象的复杂度,过度使用装饰模式会导致代码难以理解和维护。
因此,在实际应用中,我们可以根据具体情况选择使用开放-封闭原则还是装饰模式。
以下是一些建议:
- 如果需要对现有代码进行频繁的修改,则可以使用装饰模式,以提高代码的灵活性。
- 如果需要对现有代码进行重大的修改,则可以使用开放-封闭原则,以降低代码的耦合度,便于代码的维护。
- 如果需要将通用的功能抽取出来,则可以使用装饰模式,以提高代码的复用性。
总而言之,开放-封闭原则和装饰模式都是非常有用的设计原则和设计模式,我们可以根据具体情况选择使用。