【发布时间】:2014-10-17 22:54:19
【问题描述】:
我目前正在学习装饰器模式。我写了这个程序来测试我的知识。我说对了吗?
public interface Logger {
void log(String msg);
}
public class BasicLogger implements Logger {
@Override
public void log(String msg) {
System.out.println("BasicLogger: " + msg);
}
}
这是我开始感到困惑的地方,如果我要在 HTMLLogger 类中覆盖它,那么装饰器中的 logger.log(msg) 有什么意义?
public class LoggerDecorator implements Logger {
Logger logger;
public LoggerDecorator(Logger logger) {
this.logger = logger;
}
@Override
public void log(String msg) {
logger.log(msg);
}
}
我什至应该复制logger.log(msg); 行(或装饰器拥有的任何东西)?
public class HTMLLogger extends LoggerDecorator {
public HTMLLogger(Logger logger) {
super(logger);
}
@Override
public void log(String msg) {
logger.log(msg);
System.out.println("<HTML> HTML Logger" + msg);
//Generate the html file
}
}
最后,在演示课中我有这个:
public LoggerTest() {
BasicLogger logger = new BasicLogger();
Logger htmlLogger = new HTMLLogger(new BasicLogger());
logger.log("Basic Logger log");
htmlLogger.log("HTML Logging");
}
输出是:
BasicLogger: Basic Logger log
BasicLogger: HTML Logging
<HTML> HTML LoggerHTML Logging
我真的需要对装饰器模式有深入的了解,因为我需要使用 AspectJ 来实现它。
【问题讨论】:
-
是的,你说得对。在一定程度上。通常在您的装饰器中,甚至在装饰器的子级中,您希望在让工作发生在超类中之前放入某种类型的逻辑。例如,在您的 HTML 中,您可能想要搜索非 HTML 友好字符并替换它们。或者添加验证,或者支持多个输出目的地。
标签: java design-patterns decorator