责任链设计模式(Chain of Responsibility Pattern)
描述: 责任链设计模式属于行为型模式,在这种模式中通常每个接收者都包含对另一个接收者的调用。
从而形成链式调用
核心思想: 避免请求发送者于接收者耦合在一起,让多个都有可能接收请求,将这些对象链接成一条链,并且沿着这条链传递请求。直到对象处理完为止。
使用场景:
- 有多个对象可以处理同一个请求,具体那个对象处理改请求由运行时决定
- 在不明确指定接收者的情况下,向多个对象中的一个对象提交一个请求
- 可动态的指定一组对象处理请求
责任链设计模式的优点:
- 降低耦合度。它将请求的发送者和接收者解耦。
- 简化了对象。使得对象不需要知道链的结构。
- 增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。
- 增加新的请求处理类很方便。
责任链设计模式的缺点:
- 不能保证请求一定被接收。
- 系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。
- 可能不容易观察运行时的特征,有碍于除错。
示例:
现在有需求有一个字符串需要对它进行处理, 替换敏感字符, 特殊符号进行特殊的处理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| class Msg{ String name; String msg; public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } @Override public String toString() { return "Msg{" + "msg='" + msg + '\'' + '}'; } }
|
1 2 3
| interface Filter{ void doFilter(Msg m); }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| class FilterChain implements Filter{ List<Filter> filters = new ArrayList<>(); public FilterChain add(Filter f){ filters.add(f); return this; } @Override public boolean doFilter(Msg m){ for (Filter f : filters){ if (!f.doFilter(m)) return false; } return true; } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| class HTMLFilter implements Filter{ @Override public boolean doFilter(Msg m) { String r = m.getMsg(); if(r == null ){ return false; } r = r.replace('<','['); r = r.replace('>',']'); m.setMsg(r); return true; } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| class SensitiveFilter implements Filter{ @Override public boolean doFilter(Msg msg) { String r = msg.getMsg(); if(r == null ){ return false; } r = r.replaceAll("996","955"); msg.setMsg(r);
return true; } }
|
1 2 3 4 5 6 7 8 9
| public static void main(String[] args) { Msg msg = new Msg(); msg.setMsg("大家好,<我是智翁>,欢迎访问 www.yaozw.top,大家都是996"); FilterChain filterChain = new FilterChain(); filterChain.add(new HTMLFilter()).add(new SensitiveFilter()); boolean ss = filterChain.doFilter(msg); System.out.println(msg.getMsg()); } }
|
总结:
封装需要进行变化的地方,在现在的实例中,我们需要封装的是字符串的处理逻辑。我们可以将这个逻辑抽象出来,并对其进行封装。
附图: