设计模式之装饰器模式
- 一、故事引入
- 二、介绍
-
- [1、定义装饰器模式(Decorator Pattern)](#1、定义装饰器模式(Decorator Pattern))
- [2、 装饰器模式常用于以下场景:](#2、 装饰器模式常用于以下场景:)
- 3、装饰器模式的角色
-
- [1. 抽象组件(Component)](#1. 抽象组件(Component))
- [2. 具体组件(Concrete Component)](#2. 具体组件(Concrete Component))
- [3. 抽象装饰器(Decorator)](#3. 抽象装饰器(Decorator))
- [4. 具体装饰器(Concrete Decorator)](#4. 具体装饰器(Concrete Decorator))
- 三、代码实战
-
- 1、类图
- [2、Component 接口定义要被装饰的对象的接口](#2、Component 接口定义要被装饰的对象的接口)
- [3、House 实现 Component 接口,房屋的外观](#3、House 实现 Component 接口,房屋的外观)
- [4、HouseDecorator 装饰器类,实现 Component 接口,并持有一个 Component 对象](#4、HouseDecorator 装饰器类,实现 Component 接口,并持有一个 Component 对象)
- [5、 ConcreteDecorator 具体的装饰器类,继承 Decorator 类](#5、 ConcreteDecorator 具体的装饰器类,继承 Decorator 类)
- 6、实例
- 7、结果
- 四、总结
一、故事引入
随着岁月的侵蚀,小明家的房子(需要给增加额外功能的对象 )经过风雨的洗礼,已经旧得不行,他决定找一位设计师来改造一下样式(对象的造型)。设计师来到小明家,仔细查看了一下房子,然后开始提建议。
设计师说:"房主,我有一个非常独特的想法可以改变你的房子款式。"
小明好奇地问:"什么想法?"
设计师神秘地笑道:"我们可以把你的房子变成'八宝盒'款式。" 增加的功能
小明一脸疑惑:"什么是'八宝盒'款式?"
设计师解释道:"就是把你的房子的八个门都装上不同的锁,并且每个门后面放上一个宝箱,里面装满了财富。"可以理解为装饰器
小明听了之后大笑:"哈哈哈,这个主意虽然有点怪异,但听起来很有趣。不过我想,如果我真的这样改造房子,别人进来后会不会误以为这是月饼呀
tips:通过上面的小故事,我们能大概了解到装饰器模式包含哪些角色了,房屋(被装饰的对象)、外观(房屋已经旧的不行)、装修工人(装饰器工具)、外观装修为八宝盒(具体装饰器房屋外观改为八宝盒)
在装饰器模式中,抽象组件是被装饰的对象,具体组件是被装饰的对象的实现,抽象装饰器是装饰器的抽象基类,具体装饰器是具体的装饰器类。装饰器模式通过动态组合对象,实现了对对象的额外行为的添加和变化,而不需要修改被装饰对象的代码。
二、介绍
1、定义装饰器模式(Decorator Pattern)
是一种结构型设计模式,它允许你通过将对象包装在具有相同接口的装饰器类中来动态地改变对象的行为。装饰器模式允许分别给被装饰者添加新的行为,而无需改变其结构。这样可以提高代码的灵活性和可扩展性。
2、 装饰器模式常用于以下场景:
- 当需要在不改变已有代码的情况下,给一个对象添加附加的功能或修改其行为时,可以使用装饰器模式。
- 当需要动态地给一个对象添加功能,并且这些功能可以动态撤销时,可以使用装饰器模式。
3、装饰器模式的角色
1. 抽象组件(Component)
定义了抽象接口,是被装饰对象和装饰器共同实现的接口。
2. 具体组件(Concrete Component)
实现抽象组件接口的具体对象,是装饰器模式的核心。
3. 抽象装饰器(Decorator)
继承或实现了抽象组件接口,并持有一个抽象组件对象的引用。
4. 具体装饰器(Concrete Decorator)
具体实现抽象装饰器接口的装饰器类,可以增加额外的行为或功能。
三、代码实战
下面是一个用Java代码实现的例子:
1、类图
2、Component 接口定义要被装饰的对象的接口
java
package org.storemanage.regestercenter.decoratepatternmode;
/**
* @CreateTime: 2024-09-06
* @Description: 抽象组件
* @Version: 1.0
* @Author: hkf
*/
public interface Component {
//房屋外观样式
public void aspect();
}
3、House 实现 Component 接口,房屋的外观
java
package org.storemanage.regestercenter.decoratepatternmode;
/**
* @CreateTime: 2024-09-06
* @Description: 房屋-具体实现类
* @Version: 1.0
* @Author: hkf
*/
public class House implements Component {
private String name;
@Override
public void aspect() {
System.out.println("房屋经过风吹雨打,已经斑驳了----------_____-----------");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "House{" +
"name='" + name + '\'' +
'}';
}
}
4、HouseDecorator 装饰器类,实现 Component 接口,并持有一个 Component 对象
java
package org.storemanage.regestercenter.decoratepatternmode;
/**
* @CreateTime: 2024-09-06
* @Description: 房屋装饰类
* @Version: 1.0
* @Author: hkf
*/
public abstract class HouseDecorator implements Component {
protected Component component;
public HouseDecorator(Component component) {
this.component = component;
}
}
5、 ConcreteDecorator 具体的装饰器类,继承 Decorator 类
java
package org.storemanage.regestercenter.decoratepatternmode;
/**
* @CreateTime: 2024-09-06
* @Description: 房屋装修工人
* @Version: 1.0
* @Author: hkf
*/
public class HouseDecorationWorker extends HouseDecorator{
public HouseDecorationWorker(Component component) {
super(component);
}
@Override
public void aspect() {
System.out.println("现在房屋已经变成八宝盒啦!!!");
}
}
6、实例
java
package org.storemanage.regestercenter.decoratepatternmode;
/**
* @CreateTime: 2024-09-06
* @Description: 测试类
* @Version: 1.0
* @Author: hkf
*/
public class Test {
public static void main(String[] args) {
Component houseDecorationWorker = new HouseDecorationWorker(new House());
houseDecorationWorker.aspect();
}
}
7、结果
以上代码中,Component
接口定义了要被装饰的对象的接口,House
类是 Component
接口的具体实现。HouseDecorator
类是装饰器类,实现了 Component
接口并持有一个 Component
对象。HouseDecorationWorker
类继承了 Decorator
类,实现了装饰行为。
在 main
方法中创建了一个具体的组件对象 House
,然后将其传递给装饰器对象 HouseDecorationWorker
的构造方法。最后调用装饰器对象的 aspect
方法,实际上会先调用被装饰对象的 aspect
方法,然后再执行装饰行为。
四、总结
装饰器模式的核心思想是使用组合而不是继承来实现功能的添加和修改。通过将对象传递给装饰器的构造函数,我们可以将装饰器应用于任何对象,并且可以根据需求添加多个装饰器。
装饰器模式遵循单一职责原则,并且允许我们保持代码的可维护性和可扩展性。
提前恭祝大家中秋节快乐,如果对您有用,给个三连吧