责任链模式:
* 使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求, 直到有
* 对象处理它为止。
* 重点:
* 重点是在“链”上,有一条链去处理相似的请求在链中决定谁去处理这个请求,并返回相应的结果。链是由多个处理者组成的。
* 抽象的处理者必须实现三个职责:
* 1、定义一个请求的处理方法HandlerMessage,唯一对外开放的方法;
* 2、定义一个链的编排方法setNext,设置下一个处理者;
* 3、定义了具体的请求者必须实现的两个方法:定义自己能够处理的级别getHandlerLevel和具体的处理任务。
* 优点:
* 将请求和处理分开。请求者不用知道谁处理的,处理者可以不用知道请求的全貌,两者解耦,提高系统的灵活性。
* 缺点:
* 1、性能问题,每个请求都是从链头遍历到链尾,特别是在链比较长的时候,性能是一个非常大的问题
* 2、调试不很方便,特别是链条比较长,环节比较多的时候,由于采用类似递归的方式,调试的时候逻辑可能比较复杂。
* 注意:
* 链中节点数量需要控制,避免出现超长链的情况,一般做法是在Handler中设置一个最大节点数量,在setNext方法中判断是否已经是
* 超过其阈值,或者则不允许该链建立,避免无意识地破坏系统性能。
import java.util.ArrayList;
import java.util.Random;
abstract class Handler{
public final static int FALTHER_LEVEL_REQUEST=1;
public final static int HUSBAND_LEVEL_REQUEST=2;
public final static int SON_LEVEL_REQUEST=3;
//能处理的级别
private int level=0;
//责任传递,下一个责任人是谁
private Handler nextHandler;
//每个类都要说明一下自己能够处理的请求级别
public Handler(int _level){
this.level=_level;
}
//请求处理
public final void HandleMessage(IWomen women){
if (women.getType()==this.level){
this.response(women);
}else{
if (this.nextHandler!=null){
this.nextHandler.HandleMessage(women);
}else{
System.out.println("---没地方请示了,按不同意处理---\n");
}
}
}
//如果处理不了,设置下一个可能处理的对象
public void setNext(Handler _handler){
this.nextHandler=_handler;
}
//对请求的回应
protected abstract void response(IWomen women);
}
class Father extends Handler{
public Father(){
super(Handler.FALTHER_LEVEL_REQUEST);
}
@Override
protected void response(IWomen women) {
System.out.println("---女儿向父亲请示---");
System.out.println(women.getRequest());
System.out.println("父亲的答复是:同意\n");
}
}
class Husband extends Handler{
public Husband(){
super(Handler.HUSBAND_LEVEL_REQUEST);
}
@Override
protected void response(IWomen women) {
System.out.println("---妻子向丈夫请示---");
System.out.println(women.getRequest());
System.out.println("丈夫的答复是:同意\n");
}
}
class Son extends Handler{
public Son(){
super(Handler.SON_LEVEL_REQUEST);
}
@Override
protected void response(IWomen women) {
System.out.println("---母亲向儿子请示---");
System.out.println(women.getRequest());
System.out.println("儿子的答复是:同意\n");
}
}
//请求类的接口
interface IWomen{
public int getType();
public String getRequest();
}
//请求类的实现类
class Women implements IWomen{
//设置请求的类型
private int type=0;
//请求的内容
private String request="";
//通过构造函数传递请求
public Women(int _type,String _request){
this.type=_type;
switch (this.type){
case 1:
this.request="女儿的请求是:"+_request;
break;
case 2:
this.request="妻子的请求是:"+_request;
break;
case 3:
this.request="母亲的请求是:"+_request;
break;
}
}
//获得状况
@Override
public int getType() {
return this.type;
}
//获得请求
@Override
public String getRequest() {
return this.request;
}
}
//场景类
public class ZRLPattern {
public static void main(String[] args) {
//模拟随机请求
Random random = new Random();
ArrayList<IWomen> list = new ArrayList<>();
for (int i = 0; i < 5; i++) {
list.add(new Women(random.nextInt(4),"我要出去逛街"));
}
//定义三个请求对象
Father father = new Father();
Husband husband = new Husband();
Son son = new Son();
//设置请求顺序
father.setNext(husband);
husband.setNext(son);
for (IWomen women : list) {
father.HandleMessage(women);
}
}
}