# rpamis-pattern
**Repository Path**: MiaoBei/rpamis-pattern
## Basic Information
- **Project Name**: rpamis-pattern
- **Description**: 🌱rpamis-pattern A set of design pattern frameworks
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2023-09-25
- **Last Updated**: 2023-09-25
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## Rpamis-pattern
🌱Rpamis-pattern项目是一组设计模式框架集合,为开发者带来开箱即用的设计模式
-------------------------------------------------------------------------------
[**中文**](README-CN.md)|[**English**](README.md)
-------------------------------------------------------------------------------
### Rpamis-pattern-chain
提供0依赖的责任链模式框架
### 快速开始
- 引入依赖
```xml
com.rpamis
rpamis-pattern-chain
1.0.5
```
- 继承`AbstractChainPipeline`创建ChainPipeline
```java
// 处理List类型数据
public class UserChainPipline extends AbstractChainPipeline> {
// 注入一些必要信息,或其他操作
}
```
- 实现`ChainHandler`创建ChainHandler
以下以创建3个处理类为例
```java
public class ValidateHandler implements ChainHandler> {
@Override
public boolean process(List handlerData) {
return handlerData.stream().anyMatch(user -> {
if (user.getName() == null || user.getPwd() == null) {
System.out.println("用户名或密码为空");
return false;
}
System.out.println("用户名或密码校验通过");
return true;
});
}
}
```
```java
public class LoginHandler implements ChainHandler> {
@Override
public boolean process(List handlerData) {
return handlerData.stream().anyMatch(user -> {
if ("test".equals(user.getName()) && "123".equals(user.getPwd())) {
user.setRole("admin");
} else {
System.out.println("用户校验失败");
return false;
}
System.out.println("用户校验通过");
return true;
});
}
}
```
```java
public class AuthHandler implements ChainHandler> {
@Override
public boolean process(List handlerData) {
return handlerData.stream().anyMatch(user -> {
if (!"admin".equals(user.getRole())) {
System.out.println("超管校验失败");
throw new RuntimeException("失败");
}
System.out.println("超管校验成功");
return true;
});
}
}
```
- 构建责任链,并启动,获取处理结果
```java
List list = new ArrayList<>();
User user = new User("test", "1232321");
list.add(user);
ChainPipeline> chain = new UserChainPipline()
.addHandler(new ValidateHandler())
.addHandler(new LoginHandler())
.addHandler(new AuthHandler())
.strategy(new FullExecutionStrategy<>());
try {
CompleteChainResult result = chain.start(list);
// 判断整个链执行结果,默认有一个失败则判断为失败
if (result.isAllow()) {
System.out.println("责任链最终执行结果为" + result.isAllow());
}
// 根据处理类class获取单个处理类执行结果
boolean validateHandlerResult = result.get(ValidateHandler.class);
} catch (ChainException e) {
e.printStackTrace();
}
```
`CompleteChainResult`
- `isAllow`:获取整个链的执行结果,有一个失败则判断为失败,返回`boolean`
- `get(Class cls)`:根据`Handler`类`class`获取某个`Handler`处理结果,返回`boolean`
#### 内置策略
- `FullExecutionStrategy`: 全执行策略,责任链默认策略,无论某个`Handler`是否成功,都会执行完所有链上的处理
- `FastReturnStrategy`:快速返回策略,当`Handler`中有一个成功就立即返回结果,后续`Handler`不再执行
- `FastFailedStrategy`:快速失败策略,当`Handler`中有一个失败就立即返回结果,后续`Handler`不再执行
#### 策略扩展
你可以通过如下两步拓展责任链处理策略
- 实现`ChainStrategy`接口
```java
public class CustomStrategy implements ChainStrategy{
@Override
public ChainResult init(Class> handlerClass, boolean processResult) {
return ChainStrategy.super.init(handlerClass, processResult);
}
@Override
public void doStrategy(T handlerData, ChainPipeline chain, ChainResult chainResult) throws IOException, ChainException {
// do your custom chainstrategy
}
}
```
`init`方法:提供了默认的处理结果包装
`doStrategy`方法:用于编写自己的责任链处理策略,`handlerData`为责任链处理的数据,`chain`为责任链上下文,`chainResult`为单次`Handler`处理的结果
- 构建责任链时使用该实现
```java
ChainPipeline> chain = new UserChainPipline()
.addHandler(new ValidateHandler())
.addHandler(new LoginHandler())
.addHandler(new AuthHandler())
.strategy(new CustomStrategy<>());
```
### 参考实现
- `AOP`:`org.springframework.aop.framework.ReflectiveMethodInvocation`
- `Tomcat`: `org.apache.catalina.core.ApplicationFilterChain`
- `SpringMVC Interceptor`: `org.springframework.web.servlet.HandlerExecutionChain`,`org.springframework.web.servlet.HandlerInterceptor`
- `Servlet Filter`:`javax.servlet.FilterChain`,`javax.servlet.Filter`