用Java责任链模式写出一个关于过滤字符串的问题
时间: 2023-11-27 20:55:27 浏览: 40
好的,以下是一个基于责任链模式的字符串过滤器示例:
首先,我们需要定义一个处理器接口 `StringFilterHandler`,该接口包含两个方法:`setNextHandler` 用于设置下一个处理器,`filter` 用于实现具体的过滤逻辑。
```java
public interface StringFilterHandler {
void setNextHandler(StringFilterHandler nextHandler);
String filter(String input);
}
```
然后,我们可以定义一个抽象处理器类 `AbstractStringFilterHandler`,该类实现了 `StringFilterHandler` 接口中的 `setNextHandler` 方法,并为 `filter` 方法提供了一个默认实现。
```java
public abstract class AbstractStringFilterHandler implements StringFilterHandler {
private StringFilterHandler nextHandler;
@Override
public void setNextHandler(StringFilterHandler nextHandler) {
this.nextHandler = nextHandler;
}
protected StringFilterHandler getNextHandler() {
return nextHandler;
}
@Override
public String filter(String input) {
String output = doFilter(input);
if (getNextHandler() != null) {
return getNextHandler().filter(output);
}
return output;
}
protected abstract String doFilter(String input);
}
```
最后,我们可以定义一些具体的处理器来实现不同的过滤需求。例如,以下是一个简单的处理器,用于将字符串中的所有空格替换成横线:
```java
public class SpaceToDashFilterHandler extends AbstractStringFilterHandler {
@Override
protected String doFilter(String input) {
return input.replaceAll(" ", "-");
}
}
```
我们还可以定义其他的处理器来实现其他的过滤需求,例如将字符串中的敏感词替换成星号等等。
最后,我们可以通过将不同的处理器组合起来,形成一个责任链,从而实现一个完整的字符串过滤器:
```java
public class StringFilter {
private StringFilterHandler firstHandler;
public StringFilter(StringFilterHandler firstHandler) {
this.firstHandler = firstHandler;
}
public String filter(String input) {
return firstHandler.filter(input);
}
}
```
使用示例:
```java
StringFilterHandler handler1 = new SpaceToDashFilterHandler();
StringFilterHandler handler2 = new SensitiveWordFilterHandler();
handler1.setNextHandler(handler2);
StringFilter filter = new StringFilter(handler1);
String output = filter.filter("Hello world!");
System.out.println(output); // 输出:Hello-world!
```
当我们调用 `filter` 方法时,字符串将依次被传递给每个处理器进行过滤,直到最后一个处理器返回结果。如果某个处理器没有返回结果,则会将原始字符串直接返回。