javaee 设计模式

去年的这个时候,我写了一系列有关JavaEE设计模式实现的博客文章。 大约一年后,我意识到我错过了我最喜欢的图案装饰器。

装饰器模式基本上是通过装饰其他对象来扩展对象功能的方法,其他对象可以包装目标对象并为其添加行为。 如果您从未使用过或听说过装饰器,我强烈建议您阅读Head First Design Patterns的第3章。

就像我之前的文章中提到的其他模式一样,JavaEE提供了一种简单而优雅的方式来使用装饰器模式。 让我们从一个简单的无状态会话Bean开始。

package com.devchronicles.decorator;import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;/**** @author murat*/
@Stateless
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class EventService {public void startService(){System.out.println("do something important here...");}
}

要开始实现装饰器模式,我们需要一个接口,以便可以将装饰器和要装饰的对象绑定在一起。

package com.devchronicles.decorator;/**** @author murat*/
public interface ServiceInterface {public void startService();
}

接口具有装饰器将在其上添加功能的方法。 接下来,我们需要对现有的EventService bean进行一些更改以使其可修饰。

package com.devchronicles.decorator;import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;/**** @author murat*/
@Stateless
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class EventService implements ServiceInterface{public void startService(){System.out.println("do something important here...");}
}

现在我们准备添加所需的装饰器。 我们需要做的就是注释我们的类,实现ServiceInterface并注入我们的服务委托。

package com.devchronicles.decorator;import javax.decorator.Decorator;
import javax.decorator.Delegate;
import javax.inject.Inject;/**** @author murat*/
@Decorator //declares this class as a decorator
public class DecoratorService implements ServiceInterface{ //must implement the service interface@Inject //inject the service@Delegate //and annotate as the delegateServiceInterface service;@Overridepublic void startService() { //implement the startService method to add functionalitySystem.out.println("decorating the existing service!");service.startService(); //let the execution chain continue}
}

几个装饰器可以使用服务接口。

package com.devchronicles.decorator;import javax.decorator.Decorator;
import javax.decorator.Delegate;
import javax.inject.Inject;/**** @author murat*/
@Decorator
public class Decorator2Service implements ServiceInterface{@Inject@DelegateServiceInterface service;@Overridepublic void startService() {System.out.println("decorating the service even further!!!");service.startService();}
}

大多数配置可以通过JavaEE6中的注释来完成。 但是,我们仍然需要添加一些xml配置以使装饰器起作用。 由于我们已经为装饰器添加了注释,因此看起来似乎很令人失望,但是配置仍然非常简单,并且需要声明执行顺序。 将以下行添加到空的beans.xml中。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"><decorators><class>com.devchronicles.decorator.DecoratorService</class><class>com.devchronicles.decorator.Decorator2Service</class></decorators>
</beans>

当执行EventService的startService方法时,装饰器将装饰ejb并将其自身的行为添加到执行中。

...INFO: WEB0671: Loading application [Decorator] at [/Decorator]
INFO: Decorator was successfully deployed in 2,534 milliseconds.
INFO: decorating the existing service!
INFO: decorating the service even further!!!
INFO: do something important here...
...

参考: JavaEE重新审视设计模式: Developer Chronicles博客上的JCG合作伙伴 Murat Yener的装饰器 。

翻译自: https://www.javacodegeeks.com/2012/10/javaee-revisits-design-patterns-decorator.html

javaee 设计模式

javaee 设计模式_JavaEE重新审视设计模式:装饰器相关推荐

  1. Java设计模式之结构型:装饰器模式

    一.什么是装饰器模式: 当需要对类的功能进行拓展时,一般可以使用继承,但如果需要拓展的功能种类很繁多,那势必会生成很多子类,增加系统的复杂性,并且使用继承实现功能拓展时,我们必须能够预见这些拓展功能, ...

  2. 设计模式之门面模式与装饰器模式详解和应用

    目录 1 门面模式定义 1.1 门面模式的应用场景 1.2 门面模式的通用写法 1.3 门面模式业务场景实例 1.4 门面模式在源码中的应用 1.5 门面模式的优缺点 2 装饰器模式 2.1 装饰器模 ...

  3. 大聪明教你学Java设计模式 | 第七篇:装饰器模式

    前言 大聪明在写代码的过程中发现设计模式的影子是无处不在,设计模式也是软件开发人员在软件开发过程中面临的一般问题的解决方案.大聪明本着"独乐乐不如众乐乐"的宗旨与大家分享一下设计模 ...

  4. java外观设计修改_Java设计模式之外观模式和装饰器模式的设计(精选)

    前言 本篇来学习下结构型模式的外观模式和装饰器模式. 外观模式 简介 外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接 ...

  5. lambda设计模式_使用lambda的装饰器设计模式

    lambda设计模式 随着Java中lambda的出现,我们现在有了一个新工具,可以更好地设计我们的代码. 当然,第一步是使用流,方法引用和Java 8中引入的其他简洁功能. 展望未来,我认为下一步是 ...

  6. 设计模式学习(三)——装饰器模式

    前言 距离上一次正儿八经地写随笔已经有一段时间了,虽然2月10号有一篇关于泛型的小记,但是其实只是简单地将自己的学习代码贴上来,为了方便后续使用时查阅,并没有多少文字和理解感悟.之所以在今天觉得有必要 ...

  7. 从未这么明白的设计模式(三):装饰器模式

    本文原创地址:jsbintask的博客(食用效果最佳),转载请注明出处! 同系列文章: 从未这么明白的设计模式(二):观察者模式 从未这么明白的设计模式(一):单例模式 前言 装饰器模式是为了运行时动 ...

  8. Java设计模式之五 ----- 外观模式和装饰器模式

    前言 在上一篇中我们学习了结构型模式的适配器模式和桥接模式.本篇则来学习下结构型模式的外观模式和装饰器模式. 外观模式 简介 外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这 ...

  9. 设计模式(二)之装饰器模式

    定义一个代表被装饰事物的接口: public interface Coffee {public String getCoffer();public double getPrice(); } 最初的具体 ...

最新文章

  1. java面试第十四天
  2. Py之gym:gym的简介、安装、使用方法之详细攻略
  3. webpack + react 使用 eslint
  4. MyBatis 缓存详解-二级缓存验证
  5. epoll哪些触发模式_5.epoll的水平触发和边缘触发
  6. windows vbs显示桌面命令
  7. 官宣预热iQOO 7强悍配置:“性能铁三角”加持 给你强悍全感
  8. HTML控制表格边线显示。
  9. ajax post常用请求头
  10. [转] 数据挖掘 机器学习 模式识别的关系
  11. postgresql查看表的创建者和表的权限
  12. 工大瑞普 NP-ISIS综合实验
  13. Python3爬取妹子图——爬虫下载网络图片
  14. cad计算机试题及答案,CAD与CAM试题及答案.doc
  15. 物联网服务器搭建记录,心得
  16. 下载webStorm,nodejs,git并简单配置,为JavaScript做准备
  17. Echarts仪表盘的大小调整
  18. 如何把Java代码写的简洁
  19. Web前端——jQuery库
  20. 知乎引流推广运营全攻略

热门文章

  1. 成为更优秀的程序员:退后一步看问题
  2. 为什么我强烈建议大家使用枚举来实现单例
  3. CGLIB 实现代理对象API
  4. JDK9新特性实战:简化流关闭新姿势
  5. Vue及React脚手架安装
  6. myeclipse如何换一个漂亮的主题
  7. mybatis解决 1 字节的 UTF-8 序列的字节 1 无效
  8. 生物信息 python 书籍_用python做生物信息数据分析(1-环境准备)
  9. python oj 输入_Python写OJ题时输入问题
  10. java集合——视图与包装器