java 责任链模式的注解实现方式

合集下载

java设计模式之责任链

java设计模式之责任链

java设计模式之责任链⼯作中遇到这样⼀个问题,需要读取Excel⾥⾯的数据,存⼊数据库。

由于Excel是个⼈填的,所以⽇期格式有多种多样,如何才能尽可能的识别⽤户填写的五花⼋门的⽇期,最终格式化成⾃⼰想要的形式?这种需求,我想到了责任链模式总有⼀种能够命中,如果实在不⾏,那就只能认为格式错误了。

@Componentpublic class DateFormatChain {private static final List<DateTimeFormatter> formatList= Lists.newArrayList();@PostConstructpublic static void init() {formatList.add(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));formatList.add(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"));formatList.add(DateTimeFormatter.ofPattern("yyyy-MM-dd HH"));formatList.add(DateTimeFormatter.ofPattern("yyyy-MM-dd"));formatList.add(DateTimeFormatter.ofPattern("yyyy年MM⽉dd⽇"));formatList.add(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"));formatList.add(DateTimeFormatter.ofPattern("yyyy/MM/dd"));formatList.add(DateTimeFormatter.ofPattern("yyyy/MM"));formatList.add(DateTimeFormatter.ofPattern("yyyyMMdd"));formatList.add(DateTimeFormatter.ofPattern("yyyy-MM"));formatList.add(DateTimeFormatter.ofPattern("yyyyMM"));formatList.add(DateTimeFormatter.ofPattern("yyyy"));formatList.add(new DateTimeFormatterBuilder().appendPattern("yyyy-MM").parseDefaulting(ChronoField.DAY_OF_MONTH, 1).toFormatter());formatList.add(new DateTimeFormatterBuilder().appendPattern("yyyyMM").parseDefaulting(ChronoField.DAY_OF_MONTH, 1).toFormatter());formatList.add(new DateTimeFormatterBuilder().appendPattern("yyyy/MM").parseDefaulting(ChronoField.DAY_OF_MONTH, 1).toFormatter());formatList.add(new DateTimeFormatterBuilder().appendPattern("yyyy").parseDefaulting(ChronoField.MONTH_OF_YEAR, 1).parseDefaulting(ChronoField.DAY_OF_MONTH, 1).toFormatter());}/*** 责任链模式:将字符串解析后转换成⽬标格式* @param s* @param targetFormat* @return*/private static String parseChain(String s,DateTimeFormatter targetFormat) {for (DateTimeFormatter format : formatList) {try {TemporalAccessor parse = format.parse(s);return targetFormat.format(parse);} catch (Exception e) {System.out.println(format);}}return null;}public static void main(String[] args) {final DateTimeFormatter dtf2=DateTimeFormatter.ofPattern("yyyy-MM");init();String s="2020-01-01 11:12";String s1 = parseChain(s, dtf2);System.out.println(s1);}}。

java职责链模式实现多级审批流程的方法

java职责链模式实现多级审批流程的方法

java职责链模式实现多级审批流程的方法下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。

文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor.I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!Java职责链模式在多级审批流程中的应用在软件设计模式中,职责链模式是一种行为设计模式,它允许将请求沿着处理者对象的链式结构进行传递,直到某个对象能够处理这个请求。

责任链模式(ChainofResponsibilityPattern)

责任链模式(ChainofResponsibilityPattern)

责任链模式(ChainofResponsibilityPattern)责任链模式是一种对象的行为模式。

在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。

请求在这个链上传递,直到链上的某一个对象决定处理此请求。

发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使系统可以在不影响客户端的情况下动态的重新组织链和分配责任。

一、责任链模式的结构1、责任链模式涉及的角色抽象处理者角色(Handler):定义出一个处理请求的接口。

如果需要,接口可以定义出一个方法,以设定和返回下家的引用。

这个角色通常由一个Java抽象类或Java接口实现。

图中的聚合关系给出了具体子类对下家的引用,抽象方法handlerRequest()规范了子类处理请求的操作。

具体处理者角色(ConcreteHandler):具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。

由于处理者持有下家引用,因此,如果需要,具体处理者可以访问下家。

抽象处理者角色public abstract class Handler{protected Handler successor;//定义下家的引用public abstract void handleRequest();//处理方法,调用此方法处理请求public void setSuccessor(Handler successor)//赋值方法,调用此方法设置下家{this.successor = successor;}public Handler getSuccessor()//取值方法,得到下家对象{return successor;}}具体处理者角色,如果有下家,就将请求传给下家,否则就处理请求public class ConcreteHandler extends Handler{public void handleRequest(){if (getSuccessor() != null){System.out.println("The request is passed to " + getSuccessor());getSuccessor().handleRequest();}else{System.out.println("The request is handled here.");}}}客户端角色public class Client{static private Handler handler1, handler2;public static void main(String[] args){handler1 = new ConcreteHandler();handler2 = new ConcreteHandler();handler1.setSuccessor(handler2);handler1.handleRequest();}}客户端创建了2个处理者对象,并指定第一个处理者对象的下家是第2个处理者对象,而第2个处理者对象没有下家。

java注解实现原理

java注解实现原理

Java注解的实现原理1. 什么是Java注解Java注解(Annotation)是一种用于向程序中添加元数据(metadata)的标记。

它可以在编译、运行时被读取和使用,用来为程序元素(类、方法、字段等)提供额外的信息。

Java注解具有以下特点: - 注解以@符号开头,紧跟着注解名称。

- 注解可以拥有多个元素,每个元素都具有一个名称和一个值。

- 注解可以被应用在类、方法、字段、参数等程序元素上。

Java内置了许多常用的注解,比如@Override用于标识方法重写父类方法,@Deprecated用于标识已过时的代码。

此外,开发者也可以自定义注解以满足特定需求。

2. Java注解的分类根据注解的作用范围和生命周期,Java注解可以分为三类: - 源码级别(Source Level):这些注解只存在于源码中,在编译后会被编译器抛弃。

- 编译时级别(Class Level):这些注解在编译过程中会被保留在字节码文件中,并可被反射读取。

- 运行时级别(Runtime Level):这些注解在运行时会被保留,并可通过反射读取和使用。

3. 注解的实现原理Java注解的实现原理涉及到三个主要的组成部分:注解定义、注解处理器和反射机制。

3.1 注解定义注解是通过@interface关键字来定义的,其本质是一种特殊的接口。

注解可以包含多个元素,每个元素都可以指定默认值。

public @interface MyAnnotation {String value() default "";int count() default 0;}3.2 注解处理器注解处理器(Annotation Processor)是编译器或其他工具用来处理注解的程序。

它会扫描源码中的注解,并根据注解提供的信息生成相应的代码或执行特定操作。

在Java中,注解处理器通常是通过APT(Annotation Processing Tool)来实现的。

java责任链设计模式

java责任链设计模式

java责任链设计模式本节要讲的并⾮传统意义的责任链:为了避免请求发送者与多个请求处理者耦合在⼀起,将所有请求的处理者通过前⼀对象记住其下⼀个对象的引⽤⽽连成⼀条链;当有请求发⽣时,可将请求沿着这条链传递,直到有对象处理它为⽌。

也就是说:⽤户发起⼀个请求,之后请求上链,如果当前处理者可以处理该请求,那么就直接处理;否则当前处理者把请求转发给下⼀个处理者。

本节要讲的是责任链的⼀种变形,叫做功能链,这种设计模式特别常⽤,随处可见,⽤途⼗分⼴泛。

这种模式是:⼀个链上有多个处理逻辑,⼀个请求到来会被所有逻辑处理,最后返回最终处理的结果,并不是被其中的某⼀个逻辑处理就结束,并且规则可以动态添加,1、责任链实战1、责任链的思想⾸先我们要为每⼀个规则的执⾏定义⼀个接⼝,由实现类具体执⾏规则,这些规则也就是针对指定请求的处理逻辑单元。

其次我们要把规则(处理逻辑)关联起来,最简单的办法就是将规则加⼊到List中,然后循环遍历执⾏,当然实际中这也是⼀种⽅法,下⾯我们的这种⽅式,也是先把每个规则加⼊到List中去,只是执⾏的时候,有些不同:编写责任链FilterChain,包含List属性和相关⽅法,将规则(Filter 实现类)加⼊到List中,之后取出⼀个规则执⾏,执⾏规则的业务逻辑⽅法之后,再回调FilterChain的doFilter,达到循环的⽬的。

2、编写请求对象。

这⾥我们假如处理告警信息package com.yefengyu.entity;import java.util.Date;public class Alarm{//告警idprivate Integer id;//告警事件总数:这条告警是有⼏条事件合并⽽成的private Integer eventNumber;//告警名称private String alarmName;//告警发⽣位置private String alarmAddress;//是否确认告警 0:确认 1:未确认private Integer alarmAck;//告警等级 1:可疑 2:⾼危 3:严重 4:紧急private Integer alarmLevel;//告警类型 1:停电 2:硬件 3:软件private Integer alarmType;//告警发送时间private Date date;private String desc;public Alarm(){}public Alarm(Integer id, Integer eventNumber, String alarmName, String alarmAddress, Integer alarmAck,Integer alarmLevel, Integer alarmType, Date date, String desc){this.id = id;this.eventNumber = eventNumber;this.alarmName = alarmName;this.alarmAddress = alarmAddress;this.alarmAck = alarmAck;this.alarmLevel = alarmLevel;this.alarmType = alarmType;this.date = date;this.desc = desc;}public Integer getId(){return id;}public void setId(Integer id){this.id = id;}public Integer getEventNumber(){return eventNumber;}public void setEventNumber(Integer eventNumber) {this.eventNumber = eventNumber;}public String getAlarmName(){return alarmName;}public void setAlarmName(String alarmName){this.alarmName = alarmName;}public String getAlarmAddress(){return alarmAddress;}public void setAlarmAddress(String alarmAddress) {this.alarmAddress = alarmAddress;}public Integer getAlarmAck(){return alarmAck;}public void setAlarmAck(Integer alarmAck){this.alarmAck = alarmAck;}public Integer getAlarmLevel(){return alarmLevel;}public void setAlarmLevel(Integer alarmLevel){this.alarmLevel = alarmLevel;}public Integer getAlarmType(){return alarmType;}public void setAlarmType(Integer alarmType){this.alarmType = alarmType;}public Date getDate(){return date;}public void setDate(Date date){this.date = date;}public String getDesc(){return desc;}public void setDesc(String desc){this.desc = desc;}@Overridepublic String toString(){return "Alarm{" +"id=" + id +", eventNumber=" + eventNumber +", alarmName='" + alarmName + '\'' +", alarmAddress='" + alarmAddress + '\'' +", alarmAck=" + alarmAck +", alarmLevel=" + alarmLevel +", alarmType=" + alarmType +", date=" + date +", desc='" + desc + '\'' +'}';}}3、过滤器接⼝package com.yefengyu.filter;import com.yefengyu.entity.Alarm;public interface Filter{void execute(Alarm alarm, FilterChain chain);}4、责任链package com.yefengyu.filter;import com.yefengyu.entity.Alarm;import java.util.ArrayList;import java.util.List;public class FilterChain{//规则过滤器列表,实现Filter接⼝的过滤器将真正执⾏对事件的处理private List<Filter> filters = new ArrayList<>();//过滤器列表的索引private int index = 0;//向责任链中加⼊过滤器(单个)public FilterChain addFilter(Filter filter){this.filters.add(filter);return this;}//向责任链中加⼊过滤器(多个)public FilterChain addFilters(List<Filter> filters){this.filters.addAll(filters);return this;}//处理事件(alarm)从FilterChain中获取过滤器,进⾏处理,处理完成之后过滤器会再调⽤该⽅法,//继续执⾏下⼀个filter.这就需要在每个Filter接⼝的实现类中最后⼀句需要回调FilterChain的doFilter⽅法。

java职责链模式实现多级审批流程的方法

java职责链模式实现多级审批流程的方法

java职责链模式实现多级审批流程的方法The Chain of Responsibility pattern is a behavioral design pattern in Java, which is used to pass a request through a chain of handlers until the request is handled. 职责链模式是一种在Java中使用的行为设计模式,它用于通过一系列处理程序传递请求,直到请求被处理。

In the context of multi-level approval processes, the Chain of Responsibility pattern can be used to implement a flexible and modularized approach to handling approval requests. 在多级审批流程的情境下,职责链模式可以用于实现一种灵活且模块化的处理审批请求的方法。

One of the advantages of using the Chain of Responsibility pattern for multi-level approval processes is its ability to dynamically modify the sequence of handlers without affecting the client code. 职责链模式用于多级审批流程的一个优势是它能够动态修改处理程序的顺序而不影响客户端代码。

By encapsulating the approval logic within each handler, the Chain of Responsibility pattern allows for easy maintenance and addition ofnew approval levels without impacting the existing codebase. 通过在每个处理程序中封装审批逻辑,职责链模式允许轻松地维护和添加新的审批级别而不影响现有的代码库。

java注解的实现原理

java注解的实现原理

java注解的实现原理使⽤@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)public @interface Log {String value();}Target是java中的源注解,标识注解的使⽤位置,如类,⽅法,参数,变量等。

Retention也是源注解,标识注解的作⽤范围,编译期,运⾏期。

@Log("hello")public class User {}public class Client {public static void main(String[] args) {Log log = User.class.getAnnotation(Log.class);System.out.println(log.value());}}结果为hello原理注解本质上是⼀个接⼝,public interface Logextends Annotation{public abstract String value();}接下来我们跟⼀下getAnnotation⽅法的实现原理,public <A extends Annotation> A getAnnotation(Class<A> annotationClass) {Objects.requireNonNull(annotationClass);// 关键就是annotationData()⽅法的实现return (A) annotationData().annotations.get(annotationClass);}从类上获取注解对象private AnnotationData annotationData() {while (true) { // retry loop// 缓存,只会创建⼀次AnnotationData annotationData = this.annotationData;int classRedefinedCount = this.classRedefinedCount;if (annotationData != null &&annotationData.redefinedCount == classRedefinedCount) {return annotationData;}// null or stale annotationData -> optimistically create new instance// 看⼀下java是如何创建注解的数据的AnnotationData newAnnotationData = createAnnotationData(classRedefinedCount);// try to install itif (Atomic.casAnnotationData(this, annotationData, newAnnotationData)) {// successfully installed new AnnotationDatareturn newAnnotationData;}}}Class内部对注解数据是使⽤了缓存的,只会解析⼀次。

java 注解实例化的方式

java 注解实例化的方式

java 注解实例化的方式如何在Java中实例化注解引言注解是Java语言中的一种特殊的元素,它提供了一种在代码中添加元数据的方式。

注解本身并不会改变代码的执行逻辑,但它可以作为编译器和其他工具的参考信息,用来实现一些特殊的功能。

在Java中,我们一般是通过在代码中使用注解来标记特定的元素,并在编译、运行或者其他阶段对其进行处理。

在本文中,我们将探讨如何在Java中实例化注解。

注解的定义和使用首先,让我们先了解一下注解的基本定义和使用方式。

1. 定义注解在Java中,我们可以通过使用元注解(meta-annotation)来定义注解。

元注解是用来修饰注解的注解。

常见的元注解包括:- @Retention: 用来指定注解的保留策略,即注解在哪个阶段可见。

常见的策略有源码级别(SOURCE)、编译时(CLASS)和运行时(RUNTIME)。

- @Target: 用来指定注解的作用目标,即注解可以标记哪些元素。

常见的目标包括类型(TYPE)、方法(METHOD)、字段(FIELD)等。

- @Documented: 用来指定注解是否应该被包含在文档中。

- @Inherited: 用来指定注解是否可以被继承。

以下是一个简单的注解定义的例子:java@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)public @interface MyAnnotation {String value() default "";}2. 使用注解一旦我们定义了注解,我们就可以在代码中使用它来标记特定的元素了。

在使用注解时,我们可以为注解的成员变量指定值,也可以使用默认值。

以下是一个使用自定义注解的例子:javapublic class MyClass {@MyAnnotation("Hello")public void myMethod() {do something}}实例化注解注解的实例化是通过创建一个实现了注解接口的实例来完成的。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Java责任链模式是一种行为设计模式,它允许多个对象依次处理同一个请求。

这种模式的主要优点是降低了请求的发送者和接收者之间的耦合,同时增强了代码的可扩展性和灵活性。

在本文中,我们将探讨Java责任链模式的注解实现方式,通过引入注解的方式来简化责任链模式的实现。

1. 什么是责任链模式?
责任链模式是一种将请求的发送者和接收者解耦的设计模式。

在责任链模式中,多个对象依次处理同一个请求,直到其中一个对象能够处理该请求为止。

这些对象被组织成一条链,因此称之为责任链模式。

责任链模式的主要角色包括抽象处理者、具体处理者和客户端。

2. 责任链模式的注解实现方式
在Java中,我们可以通过引入注解的方式简化责任链模式的实现。

下面我们将介绍具体的注解实现方式。

2.1 定义注解
我们需要定义一个注解来标识处理请求的方法。

这个注解可以包含一些元属性,用来指定请求的类型或其他相关信息。

例如:
```java
Target(ElementType.METHOD)
Retention(RetentionPolicy.RUNTIME)
public interface RequestHandler {
String value();
}
```
在上面的代码中,我们定义了一个名为`RequestHandler`的注解,并
指定了它的目标为方法。

我们使用`value`属性来指定处理请求的类型。

2.2 实现具体处理者
接下来,我们需要实现具体的处理者,并在处理方法上添加
`RequestHandler`注解来标识该方法能够处理的请求类型。

例如:
```java
public class ConcreteHandlerA implements Handler {
RequestHandler("typeA")
public void handleRequest(Request request) {
// 处理类型为typeA的请求
}
}
在上面的代码中,我们定义了一个名为`ConcreteHandlerA`的具体处理者,并在`handleRequest`方法上添加了
`RequestHandler("typeA")`注解,表示该方法能够处理类型为
`typeA`的请求。

2.3 客户端
我们需要编写一个客户端来调用责任链模式。

客户端负责构建责任链并向责任链发送请求。

例如:
```java
public class Client {
public static void m本人n(String[] args) {
Handler handlerA = new ConcreteHandlerA();
Handler handlerB = new ConcreteHandlerB();
handlerA.setNext(handlerB);
// 构建责任链
Request request = new Request("typeA");
handlerA.handle(request);
}
```
在上面的代码中,我们首先实例化了`ConcreteHandlerA`和
`ConcreteHandlerB`两个具体处理者,然后将它们组合成责任链。

我们创建了一个类型为`typeA`的请求,并将该请求发送给责任链。

3. 总结
通过引入注解的方式,我们可以简化责任链模式的实现,并且使得责任链的配置和管理更加方便。

使用注解可以使得责任链模式的代码更加清晰和易于理解。

当然,如果责任链的规模较大或者处理逻辑较为复杂时,注解可能会显得力不从心,这时候我们还是需要使用传统的责任链模式来进行实现。

希望本文对您理解Java责任链模式的注解实现方式有所帮助。

相关文档
最新文档