Decorator模式(装饰、修饰)
定义:一种动态地往一个类中添加新地行为(功能)的设计模式。装饰模式相比生成子类更灵活,这样可以给某个对象而不是整个类添加一些功能。
Decorator模式和Composite模式很类似,都是实现容器与内容、装饰与被装饰的一致性,可以再次查看文章:复习:GoF的23种设计模式之Composite模式(结构型)。Decorator模式实现类继承再编译时增加行为。即:接口(API)是“透明的”,装饰物与被装饰物具有的方法都是相同的。Java IO流就是典型地装饰模式。
举一个例子:
就拿蛋糕的制作来说,蛋糕就是一层一层的,最核心的一层是软蛋糕,上面再附上一层奶油,再敷上水果,就大致完成一个水果蛋糕了,这个一层一层就是装饰物,装饰物并没有改变原有的蛋糕,但是又增加多种味道,装饰物(水果、奶油)与被装饰物(核心蛋糕)除了“一致性,并且也是“透明”的。
示例代码:
代码语言:javascript复制//链式调用 一致性到透明性
public class DecoratorTest {
public static void main(String[] args) {
CakeAbstractComponent coreCake = new CoreCakeConcreteComponent("名字:核心蛋糕1");
coreCake.getUse();
AbstractDecorator cream1 = new CreamConcreteDecorator(
new CreamConcreteDecorator(
new CoreCakeConcreteComponent("名字:核心蛋糕2")));
cream1.getUse();
}
}
abstract class CakeAbstractComponent { //蛋糕的接口
public abstract void getUse();
public abstract String getName();
}
class CoreCakeConcreteComponent extends CakeAbstractComponent {
private String name;
public CoreCakeConcreteComponent(String name) {
this.name = name;
}
public void getUse() {
System.out.println("只是未装饰的蛋糕");
}
public String getName() {
return name;
}
}
abstract class AbstractDecorator extends CakeAbstractComponent{//抽象的装饰物
protected CakeAbstractComponent component;
public AbstractDecorator(CakeAbstractComponent component) {
this.component = component;
}
}
class CreamConcreteDecorator extends AbstractDecorator{
public CreamConcreteDecorator(CakeAbstractComponent component) {
super(component);
}
public void getUse() {
System.out.println("在上面增加奶油了");
component.getUse();
System.out.println("在下面增加奶油了");
}
public String getName() {
return component.getName() "奶油";
}
}
UML类图