-1

我已经看过这个问题在此处输入链接描述

但是我似乎无法找到为什么两个对象之间存在组合的答案

uml 的链接在这里:

在此处输入链接描述

谁能给我解释一下为什么会有作文?或者为什么除了概括之外还有其他东西?

4

1 回答 1

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);
    }
}

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

如果您必须在没有组合(或更确切地说是委托)的情况下执行此操作,则必须创建 aWithCurrentDateFileLogger和 a WithCurrentDateConsoleLogger(为每个具体记录器添加一个子类)。由于组合的数量很大,所有其他装饰或具体记录器类型都会使要创建的类数量爆炸式增长。

于 2012-12-25T17:25:41.663 回答