Chain of Responsibility(责任链模式)
应用场景
- 在论坛中发表文章
- 后台要经过信息处理才可以发表或者进入数据库
简单用法
- 处理一段字符串
- 不同的Filter做不同的事情
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
Msg msg = new Msg();
msg.setMsg("大家好:), <script> ,欢迎访问 mashibing.com, 大家都是996");
ArrayList<Filter> filters = new ArrayList<>();
//链式 不同的Filter 做不同的处理
filters.add(new HTMLFilter());
filters.add(new SensitiveFilter());
for (Filter filter : filters) {
filter.doFiler(msg);
}
System.out.println(msg);
}
}
class Msg {
String name;
String msg;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
@Override
public String toString() {
return "Msg{" +
"name='" + name + '\'' +
", msg='" + msg + '\'' +
'}';
}
}
interface Filter{
void doFiler(Msg m);
}
class HTMLFilter implements Filter{
@Override
public void doFiler(Msg m) {
String r = m.getMsg();
r = r.replace('<', '[');
r = r.replace('>', ']');
m.setMsg(r);
}
}
class SensitiveFilter implements Filter{
@Override
public void doFiler(Msg m) {
String r = m.getMsg();
r = r.replace("996", "955");
m.setMsg(r);
}
}
责任链增加(门面模式)后的写法
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
Msg msg = new Msg();
msg.setMsg("大家好:), <script> ,欢迎访问 mashibing.com, 大家都是996");
FilterChain filterChain = new FilterChain();
//链式 不同的Filter 做不同的处理
filterChain.add(new HTMLFilter());
filterChain.add(new SensitiveFilter());
filterChain.doFilter(msg);
System.out.println(msg);
}
}
class Msg {
String name;
String msg;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
@Override
public String toString() {
return "Msg{" +
"name='" + name + '\'' +
", msg='" + msg + '\'' +
'}';
}
}
interface Filter{
void doFiler(Msg m);
}
class HTMLFilter implements Filter{
@Override
public void doFiler(Msg m) {
String r = m.getMsg();
r = r.replace('<', '[');
r = r.replace('>', ']');
m.setMsg(r);
}
}
class SensitiveFilter implements Filter{
@Override
public void doFiler(Msg m) {
String r = m.getMsg();
r = r.replace("996", "955");
m.setMsg(r);
}
}
class FilterChain{
List<Filter> list = new ArrayList<>();
public void add(Filter filter){
list.add(filter);
}
public void doFilter(Msg m){
for (Filter filter : list) {
filter.doFiler(m);
}
}
}
最终写法
- FilterChain其实自己也是一个Filter
- 只不过FilterChain是链条中做决定是否继续执行的Filter
- 不同的Filter都是链条的一部分
- 每个Filter做自己的事情
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
Msg msg = new Msg();
msg.setMsg("大家好:), <script> ,欢迎访问 mashibing.com, 大家都是996");
FilterChain f = new FilterChain();
FilterChain f2 = new FilterChain();
//链式 不同的Filter 做不同的处理
f.add(new HTMLFilter())
.add(new SensitiveFilter());
f2.add(new FaceFilter())
.add(new URLFilter());
f.add(f2);
f.doFiler(msg);
System.out.println(msg);
}
}
class Msg {
String name;
String msg;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
@Override
public String toString() {
return "Msg{" +
"name='" + name + '\'' +
", msg='" + msg + '\'' +
'}';
}
}
interface Filter{
void doFiler(Msg m);
}
class HTMLFilter implements Filter{
@Override
public void doFiler(Msg m) {
String r = m.getMsg();
r = r.replace('<', '[');
r = r.replace('>', ']');
m.setMsg(r);
}
}
class SensitiveFilter implements Filter{
@Override
public void doFiler(Msg m) {
String r = m.getMsg();
r = r.replace("996", "955");
m.setMsg(r);
}
}
class FaceFilter implements Filter{
@Override
public void doFiler(Msg m) {
String r = m.getMsg();
r = r.replace(":)", "0.0");
m.setMsg(r);
}
}
class URLFilter implements Filter{
@Override
public void doFiler(Msg m) {
String r = m.getMsg();
r = r.replace("mashibing.com", "www.baidu.com");
m.setMsg(r);
}
}
class FilterChain implements Filter{
List<Filter> list = new ArrayList<>();
public FilterChain add(Filter filter){
list.add(filter);
return this;
}
@Override
public void doFiler(Msg m) {
for (Filter filter : list) {
filter.doFiler(m);
}
}
}
一个没通过后面都不会执行
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
Msg msg = new Msg();
msg.setMsg("大家好:), <script> ,欢迎访问 mashibing.com, 大家都是996");
FilterChain f = new FilterChain();
FilterChain f2 = new FilterChain();
//链式 不同的Filter 做不同的处理
f.add(new HTMLFilter())
.add(new SensitiveFilter());
f2.add(new FaceFilter())
.add(new URLFilter());
f.add(f2);
f.doFiler(msg);
System.out.println(msg);
}
}
class Msg {
String name;
String msg;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
@Override
public String toString() {
return "Msg{" +
"name='" + name + '\'' +
", msg='" + msg + '\'' +
'}';
}
}
interface Filter{
boolean doFiler(Msg m);
}
class HTMLFilter implements Filter{
@Override
public boolean doFiler(Msg m) {
String r = m.getMsg();
r = r.replace('<', '[');
r = r.replace('>', ']');
m.setMsg(r);
return true;
}
}
class SensitiveFilter implements Filter{
@Override
public boolean doFiler(Msg m) {
String r = m.getMsg();
r = r.replace("996", "955");
m.setMsg(r);
return false;
}
}
class FaceFilter implements Filter{
@Override
public boolean doFiler(Msg m) {
String r = m.getMsg();
r = r.replace(":)", "0.0");
m.setMsg(r);
return true;
}
}
class URLFilter implements Filter{
@Override
public boolean doFiler(Msg m) {
String r = m.getMsg();
r = r.replace("mashibing.com", "www.baidu.com");
m.setMsg(r);
return true;
}
}
class FilterChain implements Filter{
List<Filter> list = new ArrayList<>();
public FilterChain add(Filter filter){
list.add(filter);
return this;
}
@Override
public boolean doFiler(Msg m) {
for (Filter filter : list) {
if(!filter.doFiler(m)){
return false;
}
}
return true;
}
}