Decorator pattern

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


发email:

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


假如我们有一个系统监控的接口,它的功能很简单,就是当系统发生异常时进行处理动作。然后我们实现了一个能够日志记录的实现类,当系统发生异常只要把日志 记录好就可以了。可是后来我们又想记录完日志后需要给维护人员发邮件,根据开闭原则,我们不能去修改记录日志的类啊,所以这时就需要用到装饰模式了,定义 一个能发送邮件的监控接口实现类,它其中保持了一个监控接口的实例(那个能记日志的实现类),这时,我们调用本实现类时,就即能记录日志,又能发邮件了。 再后来,老大又想加一个系统发生严重异常时能电话通知的功能,没关系,再写一个能电话通知的实现类,什么都不用改,OK了!

  1. 装饰者模式——动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。  
  2. 装饰者模式就是给一个对象动态的添加新的功能,装饰者和被装饰者实现同一个接口,装饰者持有被装饰者的实例。 

参考: http://wuhongyu.iteye.com/blog/2024091


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值