• Java设计模式菜鸟系列(三)装饰者模式建模与实现


    转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39759199


    装饰者(Decorator)模式:动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更具有弹性的替代方案。

    对于装饰者模式,它事实上是一种包装。所以我更愿意称它为一种包装。像咱们曾经常常使用的Java里面的IO流就用到了装饰者模式。比方:BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file1)));这里file1为目标对象,而像BufferedReader、InputStreamReader就能够称之为包装类。以下举例说明:


    一、UML模型图



    二、代码实现

    /**
     * 对改动关闭,对扩展开放。

    * * 统一接口 */ interface Filterable { public void filter(); } /** * 目标类 */ class Filter implements Filterable { @Override public void filter() { System.out.println("目标类的核心过滤方法..."); } } /** * DecoratorForFilter1包装类与目标类实现同样的接口 --> 织入Log */ class DecoratorForFilter1 implements Filterable { private Filterable filterable; public DecoratorForFilter1(Filterable filterable) { this.filterable = filterable; } private void beforeMethod() { System.out.println("DecoratorForFilter1 --> 核心过滤方法运行前运行"); } private void afterMethod() { System.out.println("DecoratorForFilter1 --> 核心过滤方法运行后运行"); } @Override public void filter() { beforeMethod(); filterable.filter(); afterMethod(); } } /** * DecoratorForFilter2包装类与目标类实现同样的接口 --> 织入Log */ class DecoratorForFilter2 implements Filterable { private Filterable filterable; public DecoratorForFilter2(Filterable filterable) { this.filterable = filterable; } private void beforeMethod() { System.out.println("DecoratorForFilter2 --> 核心过滤方法运行前运行"); } private void afterMethod() { System.out.println("DecoratorForFilter2 --> 核心过滤方法运行后运行"); } @Override public void filter() { beforeMethod(); filterable.filter(); afterMethod(); } } /** * client測试类 * * @author Leo */ public class Test { public static void main(String[] args) { /** * 目标对象 */ Filterable targetObj = new Filter(); /** * 包装对象(对目标对象进行包装) */ Filterable decorObj = new DecoratorForFilter1(new DecoratorForFilter2( targetObj)); /** * 运行包装后的业务方法 */ decorObj.filter(); } }


    输出:

    DecoratorForFilter1 --> 核心过滤方法运行前运行
    DecoratorForFilter2 --> 核心过滤方法运行前运行
    目标类的核心过滤方法...
    DecoratorForFilter2 --> 核心过滤方法运行后运行
    DecoratorForFilter1 --> 核心过滤方法运行后运行


    三、应用场景(仅代表个人观点)

    I/O、过滤器

    四、小结

    通过输入的Log我们能够看到:输出的过程事实上是将包装类“拆包”的过程,就像包装袋一样一层一层的拆开。

    设计原则:1)多用组合。少用继承。

    2)对扩展开放,对改动关闭。



  • 相关阅读:
    初学者bootstrap(五)JavaScript插件(上)在路上(6)
    初学者bootstrap(三)下载与安装在路上(7)
    Viewport响应式 Web 设计在路上(13)
    初学者动画(一)在路上(3)
    svn添加强制注释,precommit结合python
    ftpclient卡死问题
    @Transactional失效的问题
    javamail发送二进制流附件的问题
    springmvc附件上传核心代码
    kafka集群配置与测试
  • 原文地址:https://www.cnblogs.com/wgwyanfs/p/6749548.html
Copyright © 2020-2023  润新知