1,为什么要使用职责链设计模式
如果我们现在有一个需求,一个人他生了病,这个病要在三级医院才能看,但是这个病人并不清楚,就先去了一级医院,一级医院的医生告诉他你的病要去二级医院看,二级医院也告诉他
你的病我这里看不了,你要去三级医院才能看,最后他去三级医院把病看好了.
这个过程直接写成代码:
class Patient{
//病情等级
public final static int PATIENTTYPEONE = 0;
public final static int PATIENTTYPETWO = 1;
public final static int PATIENTTYPETHREE = 2;
private int patientType = 0;
public Patient(int patientType) throws Exception{
if(patientType < 0 || patientType > 2){
throw new Exception("类型错误");
}
this.patientType = patientType;
}
public int getPatientType() {
return patientType;
}
}
class Hospital{
public void seeDoctor(Patient patient){
switch(patient.getPatientType()){
case Patient.PATIENTTYPEONE:
System.out.println("一级Hospital看病");
break;
case Patient.PATIENTTYPETWO:
System.out.println("二级Hospital看病");
break;
case Patient.PATIENTTYPETHREE:
System.out.println("三级Hospital看病");
break;
}
}
}
public class Main {
public static void main(String[] args) throws Exception{
Patient patient = new Patient(Patient.PATIENTTYPETHREE);
Hospital hospital = new Hospital();
hospital.seeDoctor(patient);
}
}
Hospital类中的seeDoctor的责任太多违背了单一职责的原则,如果我们要去增加另外等级的医院(现在医院只有三级的划分,不过这里只做假设),这时我们就需要修改Hospital类,
违背了开闭原则.这么可以考虑一下把Hospital抽象出来,然后一级Hospital,二级Hospital,三级Hospital继承Hospital,但是子类怎么去处理Patient?这里我们可以这样考虑,把
Patient先交给一级Hospital,如果一级Hospital没有资格处理那么就交给二级Hospital,最后不行的话就交给三级Hospital。这就是职责链模式。
2,什么是职责链设计模式
职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止.
接收者和发送者都没有对象的明确信息,且链中的对象自己也并不知道链的结构.结果是职责链可简化对象的相互连接,它们仅需保持一个指向后继者的引用,而不需要保持它所有
的.
3,怎么使用职责链设计模式
按照刚才的思路设计出的的UML
HospitalHandler.class
public abstract class HospitalHandler {
protected HospitalHandler successor = null;
//设置下一级
public void setSuccessor(HospitalHandler successor){
this.successor = successor;
}
//处理请求
public abstract void HandleRequest(Patient request);
}
FristLevelHospital.class
public class FristLevelHospital extends HospitalHandler{
@Override
public void HandleRequest(Patient request) {
// TODO Auto-generated method stub
if(request.getPatientType() == Patient.PATIENTTYPEONE){
System.out.println("一级医院医治病人");
}else{
if(successor != null){
successor.HandleRequest(request);
}else{
System.out.println("一级医院不能医治病人,下级医院未设置");
}
}
}
}
SecondLevelHospital.class
public class SecondLevelHospital extends HospitalHandler{
@Override
public void HandleRequest(Patient request) {
// TODO Auto-generated method stub
if(request.getPatientType() == Patient.PATIENTTYPETWO){
System.out.println("二级医院医治病人");
}else{
if(successor != null){
successor.HandleRequest(request);
}else{
System.out.println("二级医院不能医治病人,下级医院未设置");
}
}
}
}
ThirdLevelHospital.class
public class ThirdLevelHospital extends HospitalHandler{
@Override
public void HandleRequest(Patient request) {
// TODO Auto-generated method stub
if(request.getPatientType() == Patient.PATIENTTYPETHREE){
System.out.println("三 级医院医治病人");
}else{
if(successor != null){
successor.HandleRequest(request);
}else{
System.out.println("三 级医院不能医治病人,下级医院未设置");
}
}
}
}
Patient.class
public class Patient {
public final static int PATIENTTYPEONE = 0;
public final static int PATIENTTYPETWO = 1;
public final static int PATIENTTYPETHREE = 2;
private int patientType = 0;
public Patient(int patientType) throws Exception{
if(patientType < 0 || patientType > 2){
throw new Exception("type error");
}
this.patientType = patientType;
}
public int getPatientType() {
return patientType;
}
}
Main.class
public class Main {
public static void main(String [] args) throws Exception{
HospitalHandler hospitalHandler1 = new FristLevelHospital();
HospitalHandler hospitalHandler2 = new SecondLevelHospital();
HospitalHandler hospitalHandler3 = new ThirdLevelHospital();
//设置职责链
hospitalHandler1.setSuccessor(hospitalHandler2);
hospitalHandler2.setSuccessor(hospitalHandler3);
hospitalHandler1.HandleRequest(new Patient(Patient.PATIENTTYPETHREE));
}
}
最后输出:
三 级医院医治病人