专栏首页后端Coderjava装饰者模式

java装饰者模式

首次知道装饰者模式还是学生时期,装饰听起来就是被装饰的事物被裹了一层功能,可以动态的给被装饰的事物增加一个或多个功能或当不需要时可以动态的去掉增加的装饰功能。

举个易于理解的生活例子吧,我们通常都会给自家的窗户安装窗帘,根据自己的喜好,颜色,款式等就给了这个窗口一个很美观的外在体现。

好了,看下我们的示例程序吧,很简单一个示例程序。

package com.wpw.sprintbootcommand;

public interface Sourceable {
    /**
     * 原始的方法
     */
    void original();
}

首先,我们先定义一个接口,然后被装饰者和装饰者分别实现这个接口。

package com.wpw.sprintbootcommand;

/**
 *
 */
public class Dool implements Sourceable {
    @Override
    public void original() {
        System.out.println("原始的dool");
    }
}

这里,我们定义一个名为Dool的类实现Soourceable这个接口,然后重写接口的方法,后面我们的装饰者同样实现这个接口。

package com.wpw.sprintbootcommand;

public class DecoratorDool implements Sourceable {
    private Sourceable sourceable;

    public DecoratorDool(Sourceable sourceable) {
        super();
        this.sourceable = sourceable;
    }

    @Override
    public void original() {
        System.out.println("对门进行修饰");
         sourceable.original();
        System.out.println("对门再次进行修饰");
    }
}

由于Dool这个类需要被修饰,所以在装饰者里面添加了Dool这个类的父类即Sourceable这个接口,以构造函数的形式进行注入。

测试下下面的示例程序发现我们对Dool这个实例对象已经装饰了。

package com.wpw.sprintbootcommand;

public class Test2 {
    public static void main(String[] args) {
        Sourceable decoratorSourceable = new DecoratorDool(new Dool());
        decoratorSourceable.original();
    }
}

看到下面的日志输出,发现Dool这个实例对象已经被装饰了,这就是要分享的装饰者模式,今天的文章就到这里结束了,你喜欢阅读,我喜欢分享。

"C:\Program Files\Java\jdk1.8.0_25\bin\java.exe" -Dvisualvm.id=312999071004300 "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2019.1.2\lib\idea_rt.jar=6563:C:\Program Files\JetBrains\IntelliJ IDEA 2019.1.2\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_25\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\rt.jar;D:\sprintboot-command\target\classes;C:\Users\pc\workspace\repository\repository\org\springframework\boot\spring-boot-starter-web\2.2.4.RELEASE\spring-boot-starter-web-2.2.4.RELEASE.jar;C:\Users\pc\workspace\repository\repository\org\springframework\boot\spring-boot-starter\2.2.4.RELEASE\spring-boot-starter-2.2.4.RELEASE.jar;C:\Users\pc\workspace\repository\repository\org\springframework\boot\spring-boot\2.2.4.RELEASE\spring-boot-2.2.4.RELEASE.jar;C:\Users\pc\workspace\repository\repository\org\springframework\boot\spring-boot-autoconfigure\2.2.4.RELEASE\spring-boot-autoconfigure-2.2.4.RELEASE.jar;C:\Users\pc\workspace\repository\repository\org\springframework\boot\spring-boot-starter-logging\2.2.4.RELEASE\spring-boot-starter-logging-2.2.4.RELEASE.jar;C:\Users\pc\workspace\repository\repository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;C:\Users\pc\workspace\repository\repository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;C:\Users\pc\workspace\repository\repository\org\apache\logging\log4j\log4j-to-slf4j\2.12.1\log4j-to-slf4j-2.12.1.jar;C:\Users\pc\workspace\repository\repository\org\apache\logging\log4j\log4j-api\2.12.1\log4j-api-2.12.1.jar;C:\Users\pc\workspace\repository\repository\org\slf4j\jul-to-slf4j\1.7.30\jul-to-slf4j-1.7.30.jar;C:\Users\pc\workspace\repository\repository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;C:\Users\pc\workspace\repository\repository\org\yaml\snakeyaml\1.25\snakeyaml-1.25.jar;C:\Users\pc\workspace\repository\repository\org\springframework\boot\spring-boot-starter-json\2.2.4.RELEASE\spring-boot-starter-json-2.2.4.RELEASE.jar;C:\Users\pc\workspace\repository\repository\com\fasterxml\jackson\core\jackson-databind\2.10.2\jackson-databind-2.10.2.jar;C:\Users\pc\workspace\repository\repository\com\fasterxml\jackson\core\jackson-annotations\2.10.2\jackson-annotations-2.10.2.jar;C:\Users\pc\workspace\repository\repository\com\fasterxml\jackson\core\jackson-core\2.10.2\jackson-core-2.10.2.jar;C:\Users\pc\workspace\repository\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.10.2\jackson-datatype-jdk8-2.10.2.jar;C:\Users\pc\workspace\repository\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.10.2\jackson-datatype-jsr310-2.10.2.jar;C:\Users\pc\workspace\repository\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.10.2\jackson-module-parameter-names-2.10.2.jar;C:\Users\pc\workspace\repository\repository\org\springframework\boot\spring-boot-starter-tomcat\2.2.4.RELEASE\spring-boot-starter-tomcat-2.2.4.RELEASE.jar;C:\Users\pc\workspace\repository\repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.30\tomcat-embed-core-9.0.30.jar;C:\Users\pc\workspace\repository\repository\org\apache\tomcat\embed\tomcat-embed-el\9.0.30\tomcat-embed-el-9.0.30.jar;C:\Users\pc\workspace\repository\repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.30\tomcat-embed-websocket-9.0.30.jar;C:\Users\pc\workspace\repository\repository\org\springframework\boot\spring-boot-starter-validation\2.2.4.RELEASE\spring-boot-starter-validation-2.2.4.RELEASE.jar;C:\Users\pc\workspace\repository\repository\jakarta\validation\jakarta.validation-api\2.0.2\jakarta.validation-api-2.0.2.jar;C:\Users\pc\workspace\repository\repository\org\hibernate\validator\hibernate-validator\6.0.18.Final\hibernate-validator-6.0.18.Final.jar;C:\Users\pc\workspace\repository\repository\org\jboss\logging\jboss-logging\3.4.1.Final\jboss-logging-3.4.1.Final.jar;C:\Users\pc\workspace\repository\repository\com\fasterxml\classmate\1.5.1\classmate-1.5.1.jar;C:\Users\pc\workspace\repository\repository\org\springframework\spring-web\5.2.3.RELEASE\spring-web-5.2.3.RELEASE.jar;C:\Users\pc\workspace\repository\repository\org\springframework\spring-beans\5.2.3.RELEASE\spring-beans-5.2.3.RELEASE.jar;C:\Users\pc\workspace\repository\repository\org\springframework\spring-webmvc\5.2.3.RELEASE\spring-webmvc-5.2.3.RELEASE.jar;C:\Users\pc\workspace\repository\repository\org\springframework\spring-aop\5.2.3.RELEASE\spring-aop-5.2.3.RELEASE.jar;C:\Users\pc\workspace\repository\repository\org\springframework\spring-context\5.2.3.RELEASE\spring-context-5.2.3.RELEASE.jar;C:\Users\pc\workspace\repository\repository\org\springframework\spring-expression\5.2.3.RELEASE\spring-expression-5.2.3.RELEASE.jar;C:\Users\pc\workspace\repository\repository\org\projectlombok\lombok\1.18.10\lombok-1.18.10.jar;C:\Users\pc\workspace\repository\repository\org\slf4j\slf4j-api\1.7.30\slf4j-api-1.7.30.jar;C:\Users\pc\workspace\repository\repository\org\springframework\spring-core\5.2.3.RELEASE\spring-core-5.2.3.RELEASE.jar;C:\Users\pc\workspace\repository\repository\org\springframework\spring-jcl\5.2.3.RELEASE\spring-jcl-5.2.3.RELEASE.jar" com.wpw.sprintbootcommand.Test2
对门进行修饰
原始的dool
对门再次进行修饰

本文分享自微信公众号 - WwpwW(gh_245290c1861a),作者:后端Coder

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-01-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • java责任链模式

    定义几个具体的处理器继承自抽象类,每个处理器按照自己的职责处理自己的事情,下面我们写个测试程序进行测试一下。

    后端Coder
  • java原型模式

    原型模式是用于创建重复的对象,同时又能保证性能,通过复制现有实例来创建新的实例对象,无需知道类的信息。

    后端Coder
  • java性能优化的细节

    在java程序中,性能问题的大部分原因并不在于java语言,而是程序本身。养成良好的编码习惯非常重要,能够显著地提升程序性能。

    后端Coder
  • java责任链模式

    定义几个具体的处理器继承自抽象类,每个处理器按照自己的职责处理自己的事情,下面我们写个测试程序进行测试一下。

    后端Coder
  • java原型模式

    原型模式是用于创建重复的对象,同时又能保证性能,通过复制现有实例来创建新的实例对象,无需知道类的信息。

    后端Coder
  • composer错误提示Cloning failed using an ssh key for authentication的解决方法

      早上ytkah在测试laravel用composer安装一些插件时出现了一些错误,提示如下,是github的ssh密匙认证错误,提示要重新生成token,然...

    ytkah
  • 小孩都看得懂的推荐系统

    我还是推荐系统小白,因此对此课题理解相当浅显,但一定很好懂。这才是学一样新东西的正确开始方式。

    用户5753894
  • 小程序备案视频核身一直失败

    搞了一个星期一直是这个问题,说删除小程序重新来,也是这样,能给合理的答复吗????????????????要寄幕布又不给

    ‭_5553
  • 从mysqldump自定义导出n条记录说起

    很多时候DBA需要导出部分记录至开发、测试环境,因数据量需求较小,如果原库的记录多,且表数量也多,在用mysqldump命令导出时可以添加一个where参数(如...

    July
  • 3分钟短文 | Laravel blade模板里优雅地定义PHP变量

    Laravel秉持MVC的设计理念,在V = view 中放置视图相关的内容。特别是 blade 模板引擎带来了很强大的解析方式。

    程序员小助手

扫码关注云+社区

领取腾讯云代金券