优点:相比于if else,耦合度相对降低,也更灵活,。
缺点:跟if else一样,在没找到处理者之前,都要执行一遍。
例子:模拟一个公司工作的例子,如果工作难度<3,让初级职员完成,如果工作难度<5让中级职员完成,如果工作难度<10,让高级职员完成,一层层传递。
先创建一个工作实体类:
/**
* 这是一个工作请求实体类
* jobDetails:工作详情
* difficult:难度等级
*/
public class Job {
private String jobDetails;
private int difficult;
public Job(String jobDetails, int difficult) {
this.jobDetails = jobDetails;
this.difficult = difficult;
}
public String getJobDetails() {
return jobDetails;
}
public int getDifficult() {
return difficult;
}
}
有工作自然就得有职员,创建一个职员抽象类,这是一个抽象处理者,设置责任链后续对象必须要有,处理请求核心业务方法必须要有,这是责任链模式核心:
/**
* 这是一个职员抽象类
*/
public abstract class Staff {
protected String name;
protected Staff nextStaff;
public Staff(String name) {
this.name = name;
}
//设置责任链上的后续对象
public void setNextStaff(Staff nextStaff) {
this.nextStaff = nextStaff;
}
/**
* @param job 处理请求核心业务方法
*/
public abstract void handleRequest(Job job);
}
然后创建具体处理者,也就是职员类,创建三个等级的职员,初级、中级、高级,并继承职员抽象类(抽象处理者):
import android.util.Log;
/**
* 这是一个初级职员类
* 可完成难度3级以下工作
*/
public class JuniorStaff extends Staff {
public JuniorStaff(String name) {
super(name);
}
/**
* 如果工作等级小于3,则由当前对象完成,否则传递给下一位具体处理者
*/
@Override
public void handleRequest(Job job) {
if (job.getDifficult() < 3) {
Log.d("TAG", "初级职员:" + name + "\n工作内容:" + job.getJobDetails() + "\n工作难度:" + job.getDifficult());
} else {
if (this.nextStaff != null) {
this.nextStaff.handleRequest(job);
}
}
}
}
import android.util.Log;
/**
* 这是一个中级职员类
* 可完成难度5级以下工作
*/
public class IntermediateStaff extends Staff {
public IntermediateStaff(String name) {
super(name);
}
/**
* 如果工作等级小于5,则由当前对象完成,否则传递给下一位具体处理者
*/
@Override
public void handleRequest(Job job) {
if (job.getDifficult() < 5) {
Log.d("TAG", "中级职员:" + name + "\n工作内容:" + job.getJobDetails() + "\n工作难度:" + job.getDifficult());
} else {
if (this.nextStaff != null) {
this.nextStaff.handleRequest(job);
}
}
}
}
import android.util.Log;
/**
* 这是一个高级职员类
* 可完成难度10级以下工作
*/
public class SeniorStaff extends Staff {
public SeniorStaff(String name) {
super(name);
}
/**
* 如果工作等级小于10,则由当前对象完成,否则只能呼叫大神
*/
@Override
public void handleRequest(Job job) {
if (job.getDifficult() < 10) {
Log.d("TAG", "高级职员:" + name + "\n工作内容:" + job.getJobDetails() + "\n工作难度:" + job.getDifficult());
} else {
Log.d("TAG", "已超出能力范围,呼叫大神!!!");
}
}
}
调用:
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.FragmentActivity;
/**
* 这是调用者
*/
public class MainActivity extends FragmentActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//创建三个等级的员工
Staff junior = new JuniorStaff("张三");
Staff intermediate = new IntermediateStaff("李四");
Staff senior = new SeniorStaff("王五");
//设置他们的责任链关系
junior.setNextStaff(intermediate);
intermediate.setNextStaff(senior);
Job job = new Job("项目开发", 2);
junior.handleRequest(job);
}
}
结果:
![](https://img.haomeiwen.com/i15373009/88418744316e0419.png)
已完成测试!有不对的地方欢迎指出,感恩。
网友评论