责任链模式是一种行为模式。多个处理类组成一个责任链,责任链处理同一个请求,如果处理类不处理就传递给下一个处理类来处理,每个处理类保持对下一个处理类的引用,直到遍历完所有链类直到有类来处理为止。
纯的责任链有两种行为:要么处理掉,要么不处理掉。
不纯责任链:处理器只处理其中一部分请求逻辑,责任链中所有处理器类可以不处理请求。
这里以 病人看病。刚好 脚受伤。。不知道找哪个科室。分别找内科。外科。。皮肤科 最后找到了骨科。到了。骨科医生再也没推辞了。二话不说就给他处理掉了。。
每个科室的医生都各自负责自己分内的事。所有这些科室组织成一个责任链。然后分别找这些科室。。找对了科室就会处理掉。。这个是典型的责任链模式的应用
//病人统一接口。有可能腿上。。有可能是皮肤病等。
public interface Patient{
//出问题的方法 譬如皮肤出问题。骨折等。
public void fractrue();
}
//病人的实现接口的类
pulic class PatientImpl implements Patient{
//什么病 属性
private String problem;
//构造子
public PatientImpl(String problem){
this.prodblem = problem;
}
public void fractrue(){
System.out.println("我是生的病是"+problem+",请医生帮我看一下!谢谢");
}
public void setProblem(String problem){
this.problem=problem
}
public void getProblem(String problem){
return problem;
}
}
//不同医生 看不同的病 组成一个责任链换
public inteface DoctorHandler{
//处理器是否已经处理了这个病人
public void handle(Patient patient);
}
//内科医生处理器
public class PhysicianHandler implements DoctorHandler{
//下一个处理器的引用
private DoctorHandler handler;
//具体处理器类
public void handle(Patient patient){
if(StringUtils.equals(patient.getProblem,"心脏病")){
patient.fractrue();
System.out.println("你这个心脏病很严重啊,我给看看,开几副药吃吃看!");
}else{
//丢给下一个处理器
handler.handle(patient);
}
}
public void setHandler(DoctorHandler handler){
this.handler = handler
}
}
//外科医生处理,处理大部分外科病
public class SurgeonHandler implements DoctorHandler{
//保持下一个处理器的引用
private DoctorHandler handler;
//外科处理
public void handle(Patient patient){
if(StringUtils.equals(patient,"皮肤病")){
patient.fractrue();
System.out.println("你这个病很严重,给你开几副药吧。。不然会毁容!");
}else{
//丢给下一个处理器
handler.handle(patient);
}
}
public void setHandler(DoctorHandler handler){
this.handler = handler
}
}
//骨科医生的处理器。
public void OrthopaedicsHandler implements DoctorHandler{
//下一个处理器
private DoctorHandler handler;
//骨科处理骨科病的方式
public void handle(Patient patient){
if(StringUtils.equals(patient.getProblem,"骨折")){
patient.fractrue();
System.out.println("骨折不是很严重,打一下石膏,过三天就好了!")
}else{
handler.handle(patient);
}
}
public void setHandler(DoctorHandler handler){
this.handler = handler
}
}
//客户端创建病人。。然后丢给医院的各个科室,让科室医生去看,病人不知道哪个科室能处理哪种病
public class Client{
public static void main(String args[]){
//骨折病人
Patient patient = new PatientImpl("骨折");
DoctorHandler handler = new PhysicianHandler()
DoctorHandler handler1 = new SurgeonHandler();
DoctorHandler handler2= new OrthopaedicsHandler();
handler.setHandler(handler1);
handler1.setHandler(handler2);
handler.handle(patient);
}
}
//打印结果
我是生的病是骨折,请医生帮我看一下!谢谢;
骨折不是很严重,打一下石膏,过三天就好了!;
当创建骨折病人请求时,在骨折医生这里得到了救治和处理。其他医生是不会处理点,然后丢给其他科室医生进行处理。
这个例子虽然很粗略,但是说明责任链模式的意图和用意。
责任链模式的核心:
多个处理器类组成一个环型结构。
使用场景:
1:系统发出一个请求,给多个处理器对象处理这一个请求。但是不会知道到底由哪个处理器来处理。
优点:
降低了请求和处理器之间的耦合。很轻易增加一个处理器来处理这个请求。只要维护这个环型结构就OK
缺点:由于每次请求,不知道由哪个处理器来处理(客户端并不知道)。所以每次都要遍历环形结构中所有处理器类。这样导致效率比较低下。