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

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

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

相关文章

课时105.边框属性下(掌握)

2.3连写&#xff08;分别设置四条边的边框&#xff09; border-width:上 右 下 左; border-style:上 右 下 左; border-color:上 右 下 左; 注意点&#xff1a; 1.这三个属性的取值是按顺时针来赋值的 也就是按照上右下左来赋值&#xff0c;而不是按照日常生活…

怎么用pycharm更新python_利用PyCharm操作Github(仓库新建、更新,代码回滚)

Github是目前世界上最流行的代码存储和分享平台&#xff0c;而PyCharm是Python圈中最流行的IDE&#xff0c;它很好地支持了Git操作。本文将会介绍如何利用PyCharm来连接Github&#xff0c;同时演示Github上的仓库新建、更新&#xff0c;以及代码回滚。在这之前&#xff0c;需要…

新mac 下第一次 安装 mongodb 步骤

新入手mac&#xff0c;安装mongo步骤记录&#xff1a;不建议使用网上的brew安装方法&#xff0c;因为试了半天没有成功&#xff0c;应该是新版本限制比较多&#xff01; 从mongodb官网下载mac版本mongo&#xff1a; 1.访问MongoDB官方下载地址 http://www.mongodb.org/download…

201621123065《JAVA程序设计》第11周学习总结

1. 本周学习总结 2. 书面作业 1. 源代码阅读&#xff1a;多线程程序BounceThread 1.1 BallRunnable类有什么用&#xff1f;为什么代码中需要调用Thread.sleep进行休眠&#xff1f; BallRunnable类实现Runnable接口&#xff0c;支持多线程&#xff1b;调用Thread.sleep进行休眠则…

vue使用v-for循环,动态修改element-ui的el-switch

在使用element-ui的el-switch中&#xff0c;因为要用v-for循环&#xff0c;一直没有成功&#xff0c;后来仔细查看文档&#xff0c;发现可以这样写 <el-switch v-for"(item, key) in list" v-model"item.is" :key"key" :active-value"…

前端加按钮将图片另存为_Windows 10系统如何将自己的照片制作成文件夹图标

我们大家都在电脑上建有很多文件夹&#xff0c;有时候查找自己需要的资料文件夹时不太容易&#xff0c;很浪费时间。如果将自己的照片作为常用文件夹的图标&#xff0c;看起来醒目查找时也更为方便些。下面就介绍具体的操作教程。一、将照片格式转换为图标文件格式在电脑上将图…

codeforces 125 A-E 补题

A Measuring Lengths in Baden 进制转换 水题 #include<bits/stdc.h> using namespace std;int main() {int n;scanf("%d",&n);int an/36;n-a*36;int b(n)/3;if((n%3)>2)b;while(b>12)b-12,a1;printf("%d %d\n",a,b);return 0; }B Simple …

在JAXB解组期间应用名称空间

对于某些XML模式来说&#xff0c;它是一组严格的规则&#xff0c;用于规定XML文档的结构方式。 但是对于其他人来说&#xff0c;通常的准则是指出XML的外观。 这意味着有时出于某些原因人们希望接受不符合XML模式的输入。 在此示例中&#xff0c;我将演示如何利用SAX XMLFilter…

java怎么把文件写入到usb里_如何创建PowerShell脚本以将文件复制到USB闪存驱动器?...

此代码最后准备使用可移动驱动器(例如插入的USB驱动器)&#xff1a;$drives [System.IO.DriveInfo]::GetDrives()$r $drives | Where-Object { $_.DriveType -eq Removable -and $_.IsReady }if ($r) {return ($r)[-1]}throw "No removable drives found."这种方式…

利用css transition属性实现一个带动画显隐的微信小程序部件

我们先来看效果图 像这样的一个带过渡效果的小部件在我们实际开发中的应用几率还是比较大的&#xff0c;但是在开发微信小程序的过程中可能有的小伙伴发现transition这个属性它不好使&#xff08;下面说明&#xff09;所以我们这个时候会考虑去使用微信官方提供的wx.createAnim…

c语言学生管理系统链表(dev vs2012下可以运行)

struct student { char name[10]; char sex[5]; long int num;//学号 int xuhao; int age; float score[3]; float averange; char DJ;//存放等级哦 struct student *next;};//定义结构体变量保存 名字 性别 年龄 成绩] 结构体声明int n;//存放学生人数int man;//存放统计的男生…

python 东哥 with open_python 连接redis cluster

#!/usr/bin/env python# encoding: utf-8#author: 东哥加油!#file: clear_pool.py#time: 2018/8/28 17:06from rediscluster import StrictRedisClusterimport datetimeimport sysdef redis_cluster():redis_nodes [{host:192.168.15.6,port:6379},{host:192.168.15.7,port:63…

go gcc

http://www.cnblogs.com/zkweb/p/7880099.html转载于:https://www.cnblogs.com/thrillerz/p/7958446.html

抽象工厂设计模式解释

抽象工厂设计模式是工厂设计模式的另一种形式。 这种模式可以被视为“超级工厂”或“工厂工厂”。 抽象工厂设计模式&#xff08;属于“四人帮”的一部分&#xff09;属于“创新设计模式”类别&#xff0c;它提供了一种封装一组具有公共链接的工厂的方法&#xff0c;而无需突出…

app账号退不出去_最新!多交的税可以退,同学,你今天退税了吗?

4.3 号 更新。1、有知友留言&#xff0c;已经收到退税了。2、部分地区陆续开放申报了&#xff0c;建议大家不要着急。3、大家耐心一点&#xff0c;该是你的就是你的&#xff0c;退税这个事多退少补&#xff0c;建议大家在白天上班时间去APP上看看&#xff0c;毕竟相关公务人员也…

【BZOJ2004】[Hnoi2010]Bus 公交线路 状压+矩阵乘法

【BZOJ2004】[Hnoi2010]Bus 公交线路 Description 小Z所在的城市有N个公交车站&#xff0c;排列在一条长(N-1)km的直线上&#xff0c;从左到右依次编号为1到N&#xff0c;相邻公交车站间的距离均为1km。 作为公交车线路的规划者&#xff0c;小Z调查了市民的需求&#xff0c;决定…

课时77.序选择器(掌握)

CSS3中新增的选择器最具代表性的就是序选择器。 1.同级别的第几个 1. :first-child 选中同级别中的第一个标签 注意点&#xff1a;不区分类型 但是我们这里有一个注意点&#xff0c;如果我们在第一个p之前加一个h1&#xff0c;则第一个p就不变红了&#xff0c;因为我们…

Gulp——文件压缩和文件指纹

先看下文件指纹添加成功发布后的“成果”。 首先介绍下gulp的文件压缩&#xff08;压缩css和js&#xff09; &#xff08;下面介绍的代码移步这里&#xff09; 我的文件目录如下&#xff1a; &#xff08;标红部分是生成的处理后的文件&#xff09; 如何使用gulp&#xff0c;请…

java afconsole_Java ——基础语法

package myhello; //本类所在的包的路径import af.util.AfMath;//导入对应的类import java.util.Random;//导入随机数的类public classHelloWorld{public static voidmain(String[] args){int a 8;inti;int total 0;int score 80;System.out.println(a > 8);//空语句 只有…

Java 7:使用NIO.2进行文件过滤-第2部分

大家好。 这是使用NIO.2系列进行文件过滤的第2部分。 对于那些尚未阅读第1部分的人 &#xff0c;这里有个回顾。 NIO.2是自Java 7起JDK中包含的用于I / O操作的新API。使用此新API&#xff0c;您可以执行与java.io相同的操作&#xff0c;以及许多出色的功能&#xff0c;例如&a…