装饰者UML解释了构图

时间:2012-12-25 16:28:52

标签: design-patterns uml decorator composition

我已经看过这个问题enter link description here

然而,我似乎找不到为什么两个物体之间存在构图的答案

指向uml的链接在这里:

enter link description here

任何人都可以向我解释为什么有一个作文?或为什么除了概括之外还应该有什么呢?

1 个答案:

答案 0 :(得分:1)

因为装饰器模式的要点是装饰一个包含的组件:

public interface Logger {
    void print(String message);
}

public class ConsoleLogger implements Logger {
    @Override
    public void print(String message) {
        System.out.println(message);
    }
}

public class FileLogger implements Logger {
    @Override
    public void print(String message) {
        // TODO write the message to a file
    }
}

public WithCurrentDateLoggerDecorator implements Logger {
    private Logger delegate;

    public WithCurrentDateLoggerDecorator(Logger delegate) {
        this.delegate = delegate;
    }

    @Override
    public void print(String message) {
        message = new Date() + " - " + message;
        delegate.print(message);
    }
}

使用上面的内容,装饰器可以在任何你使用任何其他记录器的地方使用,而装饰器可以装饰任何类型的记录器(控制台,文件,电子邮件,套接字等等)。它不关心具体记录器的作用(打印到控制台或打印到文件)。它只是装饰具体的记录器,在让委托记录器打印它之前,将当前日期添加到消息中。

如果必须在没有组合(或者更确切地说明)的情况下执行此操作,则必须创建WithCurrentDateFileLoggerWithCurrentDateConsoleLogger(为每个具体记录器添加一个子类)。由于组合数量很多,所有其他装饰或具体记录器类型都会使创建的类数量爆炸。