我已经看过这个问题在此处输入链接描述
但是我似乎无法找到为什么两个对象之间存在组合的答案
uml 的链接在这里:
谁能给我解释一下为什么会有作文?或者为什么除了概括之外还有其他东西?
因为装饰器模式的重点是装饰一个包含的组件:
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
(为每个具体记录器添加一个子类)。由于组合的数量很大,所有其他装饰或具体记录器类型都会使要创建的类数量爆炸式增长。