设计模式之职责链模式

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));
	}
}

最后输出:

三 级医院医治病人

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值