<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> 装饰者模式,通过组合,和继承,来实现对功能的叠加使用。通过类的引用,来时先功能叠加,以下是一个非常好的例子。</span>
interface:
public interface Monitor {
public void handle();
}
记录日志实现类:
public class LoggerMonitor implements Monitor {
@Override
public void handle() {
System.out.println("日志已记录.");
}
}
过滤器:
public class LoggerMonitorFilter extends LoggerMonitor{
protected Monitor monitor;
public LoggerMonitorFilter(Monitor monitor){
this.monitor = monitor;
}
@Override
public void handle() {
monitor.handle();
}
}
public class EmailMonitor extends LoggerMonitorFilter {
public EmailMonitor(Monitor monitor) {
super(monitor);
}
@Override
public void handle() {
monitor.handle();
System.out.println("邮件通知.");
}
}
打电话:
public class PhoneMonitor extends LoggerMonitorFilter{
public PhoneMonitor(Monitor monitor) {
super(monitor);
}
@Override
public void handle() {
monitor.handle();
System.out.println("电话通知.");
}
}
功能测试:
public class Main {
public static void main(String[] args) {
System.out.println("###############################");
System.out.println("log + email:");
Monitor monitor = new EmailMonitor(new LoggerMonitor());
monitor.handle();
System.out.println("###############################");
System.out.println("log + phone:");
monitor = new PhoneMonitor(new LoggerMonitor());
monitor.handle();
System.out.println("###############################");
System.out.println("log + email + phone");
monitor = new PhoneMonitor(new EmailMonitor(new LoggerMonitor()));
monitor.handle();
}
}
- 装饰者模式——动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
- 装饰者模式就是给一个对象动态的添加新的功能,装饰者和被装饰者实现同一个接口,装饰者持有被装饰者的实例。
参考: http://wuhongyu.iteye.com/blog/2024091