复习:GoF的23种设计模式之Decorator模式(结构型)

2019-12-30 17:58:07 浏览数 (2)

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类图

0 人点赞