Skip to content

Commit 392b97f

Browse files
committed
feat: 添加责任链模式接口模板,策略执行器支持多个匹配实现
1 parent 5d29291 commit 392b97f

15 files changed

Lines changed: 313 additions & 41 deletions

common/core/src/main/java/com/github/cadecode/uniboot/common/core/extension/ExtContext.java

Lines changed: 0 additions & 15 deletions
This file was deleted.
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.github.cadecode.uniboot.common.core.extension.pipeline;
2+
3+
import com.github.cadecode.uniboot.common.core.enums.ExtTypeCode;
4+
import com.github.cadecode.uniboot.common.core.extension.pipeline.selector.FilterSelector;
5+
import lombok.Getter;
6+
7+
/**
8+
* pipeline 上下文抽象类
9+
*
10+
* @author Cade Li
11+
* @since 2023/6/25
12+
*/
13+
@Getter
14+
public abstract class AbstractPipelineContext implements PipelineContext {
15+
16+
private final ExtTypeCode extTypeCode;
17+
private final FilterSelector filterSelector;
18+
19+
public AbstractPipelineContext(ExtTypeCode extTypeCode, FilterSelector filterSelector) {
20+
this.extTypeCode = extTypeCode;
21+
this.filterSelector = filterSelector;
22+
}
23+
24+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.github.cadecode.uniboot.common.core.extension.pipeline;
2+
3+
import com.github.cadecode.uniboot.common.core.extension.pipeline.filter.PipelineFilter;
4+
import lombok.Setter;
5+
6+
import java.util.Objects;
7+
8+
/**
9+
* 过滤器链默认实现
10+
*
11+
* @author Cade Li
12+
* @date 2023/6/20
13+
*/
14+
public class DefaultPipelineFilterChain<T extends PipelineContext> implements PipelineFilterChain<T> {
15+
16+
@Setter
17+
private PipelineFilterChain<T> next;
18+
private final PipelineFilter<T> filter;
19+
20+
public DefaultPipelineFilterChain(PipelineFilterChain<T> next, PipelineFilter<T> filter) {
21+
this.next = next;
22+
this.filter = filter;
23+
}
24+
25+
26+
/**
27+
* 当前 filter 处理
28+
*/
29+
@Override
30+
public void filter(T context) {
31+
filter.doFilter(context, this);
32+
}
33+
34+
/**
35+
* 下一 filter 处理
36+
*/
37+
@Override
38+
public void next(T context) {
39+
if (Objects.nonNull(this.next)) {
40+
this.next.filter(context);
41+
}
42+
}
43+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.github.cadecode.uniboot.common.core.extension.pipeline;
2+
3+
import com.github.cadecode.uniboot.common.core.enums.ExtTypeCode;
4+
import com.github.cadecode.uniboot.common.core.extension.pipeline.selector.FilterSelector;
5+
6+
/**
7+
* pipeline 上下文
8+
*
9+
* @author Cade Li
10+
* @since 2023/6/23
11+
*/
12+
public interface PipelineContext {
13+
14+
ExtTypeCode getPipelineType();
15+
16+
FilterSelector getFilterSelector();
17+
18+
boolean continueChain();
19+
20+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.github.cadecode.uniboot.common.core.extension.pipeline;
2+
3+
/**
4+
* 过滤器链接口
5+
*
6+
* @author Cade Li
7+
* @date 2023/6/20
8+
*/
9+
public interface PipelineFilterChain<T extends PipelineContext> {
10+
11+
void filter(T context);
12+
13+
void next(T context);
14+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.github.cadecode.uniboot.common.core.extension.pipeline;
2+
3+
import com.github.cadecode.uniboot.common.core.extension.pipeline.filter.PipelineFilter;
4+
import lombok.Getter;
5+
6+
import java.util.Objects;
7+
8+
/**
9+
* 管道构建器
10+
*
11+
* @author Cade Li
12+
* @date 2023/6/20
13+
*/
14+
public class PipelineGenerator<T extends PipelineFilter<A>, A extends PipelineContext> {
15+
16+
@Getter
17+
private DefaultPipelineFilterChain<A> firstChain;
18+
private DefaultPipelineFilterChain<A> lastChain;
19+
20+
public void appendFilter(T filter) {
21+
DefaultPipelineFilterChain<A> newChain = new DefaultPipelineFilterChain<>(null, filter);
22+
if (Objects.isNull(firstChain)) {
23+
firstChain = newChain;
24+
lastChain = firstChain;
25+
return;
26+
}
27+
lastChain.setNext(newChain);
28+
lastChain = newChain;
29+
}
30+
31+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.github.cadecode.uniboot.common.core.extension.pipeline.filter;
2+
3+
import com.github.cadecode.uniboot.common.core.extension.pipeline.PipelineContext;
4+
import com.github.cadecode.uniboot.common.core.extension.pipeline.PipelineFilterChain;
5+
6+
/**
7+
* 过滤器抽象类
8+
*
9+
* @author Cade Li
10+
* @date 2023/6/20
11+
*/
12+
public abstract class AbstractPipelineFilter<T extends PipelineContext> implements PipelineFilter<T> {
13+
14+
/**
15+
* 过滤方法模板
16+
*/
17+
@Override
18+
public void doFilter(T context, PipelineFilterChain<T> filterChain) {
19+
// 如果包含该 filter
20+
if (context.getFilterSelector().matchFilter(this.getClass().getSimpleName())) {
21+
handle(context);
22+
}
23+
if (context.continueChain()) {
24+
filterChain.next(context);
25+
}
26+
}
27+
28+
/**
29+
* 过滤处理主逻辑
30+
*/
31+
public abstract void handle(T context);
32+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.github.cadecode.uniboot.common.core.extension.pipeline.filter;
2+
3+
import com.github.cadecode.uniboot.common.core.extension.pipeline.PipelineContext;
4+
import com.github.cadecode.uniboot.common.core.extension.pipeline.PipelineFilterChain;
5+
6+
/**
7+
* 过滤器接口
8+
*
9+
* @author Cade Li
10+
* @date 2023/6/20
11+
*/
12+
public interface PipelineFilter<T extends PipelineContext> {
13+
14+
void doFilter(T context, PipelineFilterChain<T> filterChain);
15+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.github.cadecode.uniboot.common.core.extension.pipeline.selector;
2+
3+
import java.util.List;
4+
5+
/**
6+
* 过滤器选择器
7+
*
8+
* @author Cade Li
9+
* @date 2023/6/20
10+
*/
11+
public interface FilterSelector {
12+
13+
boolean matchFilter(String currFilterName);
14+
15+
List<String> getFilterNames();
16+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.github.cadecode.uniboot.common.core.extension.pipeline.selector;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.NoArgsConstructor;
5+
6+
import java.util.ArrayList;
7+
import java.util.List;
8+
import java.util.Objects;
9+
10+
/**
11+
* 基于本地 list 的过滤器选择器
12+
*
13+
* @author Cade Li
14+
* @date 2023/6/20
15+
*/
16+
@NoArgsConstructor
17+
@AllArgsConstructor
18+
public class LocalListFilterSelector implements FilterSelector {
19+
20+
private List<String> filterNames = new ArrayList<>();
21+
22+
@Override
23+
public boolean matchFilter(String currFilterName) {
24+
return filterNames.stream().anyMatch(o -> Objects.equals(currFilterName, o));
25+
}
26+
27+
@Override
28+
public List<String> getFilterNames() {
29+
return filterNames;
30+
}
31+
32+
public void addFilter(String filterName) {
33+
filterNames.add(filterName);
34+
}
35+
36+
private void addFilters(List<String> filterNames) {
37+
this.filterNames.addAll(filterNames);
38+
}
39+
}

0 commit comments

Comments
 (0)