javaee 设计模式_JavaEE重新审视设计模式:装饰器

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 设计模式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/351869.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

echarts label加边框_echarts 添加自定义label标签

1.echarts 自定义标签注&#xff1a;当设置visualMap的后&#xff0c;给覆盖regions单独定义的值(如果data 中没有regions的地区 则无妨&#xff0c;我这个是从data中删除青岛&#xff0c;但是lable 无法正常显示了&#xff0c;如有哪位大神有好的方法&#xff0c;请赐教)initC…

【15】docker

docker 一种容器技术&#xff0c;相当于 java 一侧编译多个场所运行的技术 &#xff0c;简单理解为一个盒子&#xff0c;盒子里面包裹着一个操作系统及其配置 docker 语法 #查看容器 docker ps -a #查看镜像docker images # 创建 dockerdocker run image #启动docker并且…

解析URI与URL之间的区别与联系

URI就是一种资源定位机制&#xff0c;它是比较笼统地定位了资源&#xff0c;并不局限于客户端和服务器&#xff0c;而URL就定位了网上的一切资源&#xff0c;只要是网上的资源&#xff0c;都有唯一的URL 今天在看STRUTS配置的时候&#xff0c;发现一个问题&#xff0c;就是在看…

6.数据结构

时间&#xff1a;2018年12月9日20:08:43 --------------------------------------------------------------------------------------- 0.四种&#xff1a;列表&#xff0c;元组&#xff0c;字典&#xff0c;集合 1.列表 可变数据类型&#xff08;可以添加&#xff0c;移除&…

为什么要关心均值和哈希码

等于和哈希码是每个Java对象的基本元素。 它们的正确性和性能对于您的应用程序至关重要。 但是&#xff0c;我们经常看到甚至有经验的程序员也忽略了类开发的这一部分。 在本文中&#xff0c;我将介绍一些与这两种非常基本的方法有关的常见错误和问题。 合同 提到的方法至关重…

python把英语句子成分字母_句子成分的表达字母

1.一【1】1、一般现在时(do); 2、一般过去时(did); 3、一般将来时( will do)(be going to do); 4、一般过去将来时( would do); 5、现在进行时( be doing); 6、过去进行时(was/were doing); 7、将来进行时( will be doing); 8、过去将来进行时( would be doing)(was/were going…

AntDesign Form表单字段校验的三种方式

1.使用getFieldDecorator的rules规则 最简单的方法就是使用getFieldDecorator中的rules验证。rules中定义校验规则&#xff0c;message为校验不通过时的提示文字。 {getFieldDecorator(inputContent, {rules: [{required: true, message: 请输入内容!,}],})(<Input /> )}…

matlab的max与min函数

max作用于矩阵有比较并保留较大数字的功能。如下所示&#xff1a; 矩阵a中每个元素与2相比较取较大值&#xff0c;1比2小&#xff0c;所以替换为2. 矩阵a中每个元素与3相比取较小值&#xff0c;4比3小&#xff0c;所以替换为3. a 1 2 3 4 K>> max(a,2)…

JAVA Servlet API简介及接口与类的用法

本章介绍了Java Servlet API中的主要的接口与类的用法&#xff0c;并且介绍了它们的生命周期。表4-1 对接口与类的作用与生命周期作了归纳。这些接口与类的生命周期都由Servlet容器来控制&#xff0c;容器会在特定的时刻创建或销毁它们的实例。 表4-1 Servlet API中的主要的接口…

Spring框架的事务管理的基本概念

1. 事务&#xff1a;指的是逻辑上一组操作&#xff0c;组成这个事务的各个执行单元&#xff0c;要么一起成功,要么一起失败&#xff01; 2. 事务的特性* 原子性* 一致性* 隔离性* 持久性3. 如果不考虑隔离性,引发安全性问题* 读问题:* 脏读:* 不可重复读:* 虚读:* 写问题:* 丢失…

python rest 框架_python-更新用户REST框架Django

我需要在REST框架中更新我的用户views.pyclass UserUpdate(APIView):permission_classes (permissions.IsAuthenticated,)def post(self,request):userUser.objects.get(idrequest.user.id)try:user_serializerUserSerializer(request.user,datarequest.data, partialTrue)if …

matlab将满足某一条件的矩阵元素置零

想把矩阵中小于100的元素置零&#xff0c;有两种方法&#xff1a; 方法一&#xff1a;S(S<100)0; 方法二&#xff1a;S(find(S<100))0; 原理&#xff1a; A [ 1 2; 3 4]; B (A>2) %找到大于2 的位置索引 B 0 0 1 1 %形成布尔矩阵 A(B)0 %将对…

linux nona怎么用_nano命令_Linux nano 命令用法详解:字符终端文本编辑器

nano是一个字符终端的文本编辑器&#xff0c;有点像DOS下的editor程序。它比vi/vim要简单得多&#xff0c;比较适合Linux初学者使用。某些Linux发行版的默认编辑器就是nano。nano命令可以打开指定文件进行编辑&#xff0c;默认情况下它会自动断行&#xff0c;即在一行中输入过长…

4g内存 堆内存分配多少_我需要多少内存

4g内存 堆内存分配多少什么是保留堆&#xff1f; 我需要多少内存&#xff1f; 在构建解决方案&#xff0c;创建数据结构或选择算法时&#xff0c;您可能会问自己&#xff08;或其他人&#xff09;这个问题。 如果此图包含1,000,000条边并且我使用HashMap进行存储&#xff0c;此…

centos下网络配置方法(网关、dns、ip地址配置)

centos网络配置实例 1&#xff0c;配置DNS vi /etc/resolv.conf 加入: 复制代码代码如下:nameserver 192.168.0.1 nameserver 8.8.8.8nameserver 8.8.4.42&#xff0c;配置网关&#xff1a; vi /etc/sysconfig/network 加入&#xff1a; GATEWAY192.168.0.1 完整的如下&#xf…

matlab的repmat函数

B repmat(A,m,n) 1.作用&#xff1a;将矩阵A的内容堆叠在mxn大小的矩阵B中 2.应用&#xff1a; Brepmat([1 2;3 4],3,2) B 1 2 1 2 3 4 3 4 1 2 1 2 3 4 3 4 1 2 1 2 3 4 …

Alias Method解决随机类型概率问题(别名算法)

举个例子&#xff0c;游戏中玩家推倒了一个boss&#xff0c;会按如下概率掉落物品&#xff1a;10%掉武器 20%掉饰品 30%掉戒指 40%掉披风。现在要给出下一个掉落的物品类型&#xff0c;或者说一个掉落的随机序列&#xff0c;要求符合上述概率。 一般人会想到的两种解法 第一种算…

centos mysql php tomcat_Linux 安装JDK Tomcat MySQL的教程(使用Mac远程访问)

一 环境阿里云服务器: CentOS 7.4 64位(基于RedHat)本机: macOS High Sierra二 压缩包三 文件传输输入SFTP命令连接 -> 输入实例登录密码sftp root公网IP上传put 本地文件 服务器路径下载get 服务器文件 本地路径四 远程访问输入SSH命令连接 ->输入实例登录密码ssh root公…

Java时间和日期指南

长期以来&#xff0c;正确处理日期&#xff0c;时间&#xff0c;时区&#xff0c;夏时制&#xff0c;and年等一直是我的烦恼。 本文并不是一个全面的指南时域&#xff0c;请参阅日期和时间在Java中 -更详细&#xff0c;但略有下降&#xff0c;ekhem&#xff0c;日期。 它仍然是…

Java项目打war包的方法

最近好忙好忙&#xff0c;整理下心情给大家分享下自己在工作中遇到的一点小技巧&#xff0c;希望给遇到同样麻烦的同学一点帮助。 我们知道Java项目打war包可以在Eclipse和MyEclipse工具中自动打包&#xff0c;就是右键&#xff0c;然后导出war包就可以了&#xff0c;可是我发现…