装饰器模式是一种结构型设计模式,它允许向一个现有的对象添加新的功能,同时又不改变其结构。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
装饰器模式的实际应用场景是在不想增加更多子类的情况下扩展类,动态地给一个对象添加一些额外的职责。同时,它避免了类型体系的快速膨胀。
在使用装饰器模式时,需要创建具体构建角色(真实对象)和装饰角色。具体构建角色实现抽象构建角色的接口,是一个将需要被修饰的对象。而装饰角色则持有一个抽象构建角色的实例,并实现了抽象构建角色的接口。最后,具体装饰角色负责给构建对象增加新的责任。
以买煎饼果子为例,假设我们有一个基础套餐,但客户可能会要求添加额外的配料,比如鸡蛋、香肠等。这些额外的配料可以看作是给基础套餐增加的“装饰”。
在代码中,我们可能会有一个类表示基础煎饼果子套餐,然后我们可以通过创建装饰器类来添加额外的职责。这些装饰器类可以看作是对基础套餐的“装饰”。
一个简单的例子:
// 基础套餐类
public class 煎饼果子套餐 {
public void 打印菜单() {
System.out.println("煎饼果子套餐");
}
}
// 鸡蛋装饰器类
public class 鸡蛋装饰器 implements 煎饼果子套餐 {
private 煎饼果子套餐 decorated;
public 鸡蛋装饰器(煎饼果子套餐 decorated) {
this.decorated = decorated;
}
@Override
public void 打印菜单() {
decorated.打印菜单();
System.out.println("加鸡蛋");
}
}
// 香肠装饰器类
public class 香肠装饰器 implements 煎饼果子套餐 {
private 煎饼果子套餐 decorated;
public 香肠装饰器(煎饼果子套餐 decorated) {
this.decorated = decorated;
}
@Override
public void 打印菜单() {
decorated.打印菜单();
System.out.println("加香肠");
}
}
// 测试类
public class Main {
public static void main(String[] args) {
煎饼果子套餐 base = new 煎饼果子套餐();
鸡蛋装饰器 eggDecorator = new 鸡蛋装饰器(base);
香肠装饰器 sausageDecorator = new 香肠装饰器(eggDecorator);
eggDecorator.打印菜单(); // 输出 "煎饼果子套餐 加鸡蛋"
sausageDecorator.打印菜单(); // 输出 "煎饼果子套餐 加鸡蛋 加香肠"
}
}
在这个例子中,我们创建了一个基础的煎饼果子套餐类,然后我们通过鸡蛋装饰器和香肠装饰器来给基础套餐添加额外的职责。这些职责可以看作是对基础套餐的“装饰”。
总的来说,装饰器模式是一种非常灵活和有用的设计模式,它允许我们在不改变现有对象结构的基础上,动态地添加新的功能。