`
DanielHan
  • 浏览: 54472 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
074641d7-eb86-343f-a745-65a0f693edb5
设计模式
浏览量:7142
社区版块
存档分类
最新评论

设计模式-责任链模式

阅读更多
责任链模式(Chain of Responsibility Pattern)
责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。

举例:学生请假,小病一般班长就可以批假,稍严重的病老师就可以批假,重病校长可以批假。

学生接口
public interface IStudent {
	/**
	 * description 0:班长可以处理 1:老师可以处理 2:校长可以处理
	 * @return
	 */
	public int getState();
	
	/**
	 * description 获取病假消息
	 * @return
	 */
	public String getMessage();
}


学生类
public class Student implements IStudent{
	private int state;
	private String message;
	
	public Student(int state,String message){
		this.state=state;
		this.message=message;
	}

	@Override
	public int getState() {
		return state;
	}

	@Override
	public String getMessage() {
		return message;
	}
}


处理抽象类
public abstract class Handler {
	private Handler nextHandler;
	private int state;
	
	public void setNextHandler(Handler nextHandler) {
		this.nextHandler = nextHandler;
	}

	public Handler(int state){
		this.state=state;
	}
	

	public void handle(IStudent student){
		if(this.state==student.getState()){
			System.out.println("处理了学生"+student.getState()+student.getMessage());
		}else{
			System.out.println("处理不了");
			nextHandler.handle(student);
		}
	}
}


班长类
public class Monitor extends Handler{

	public Monitor() {
		super(0);
	}

	@Override
	public void handle(IStudent student) {
		System.out.print("班长");
		super.handle(student);
	}
}


老师类
public class Teacher extends Handler{

	public Teacher() {
		super(1);
	}

	@Override
	public void handle(IStudent student) {
		System.out.print("老师");
		super.handle(student);
	}
}


校长类
public class Principal extends Handler{
	public Principal() {
		super(2);
	}

	@Override
	public void handle(IStudent student) {
		System.out.print("校长");
		super.handle(student);
	}
}


测试类
public class Demo {
	public static void main(String[] args) {
		IStudent student0=new Student(0, "拉肚子");
		IStudent student1=new Student(1, "骨折");
		IStudent student2=new Student(2, "白血病");
		
		Handler monitor=new Monitor();
		Handler teacher=new Teacher();
		Handler principal=new Principal();
		monitor.setNextHandler(teacher);
		teacher.setNextHandler(principal);
		
		monitor.handle(student0);
		System.out.println("---------");
		monitor.handle(student1);
		System.out.println("---------");
		monitor.handle(student2);
	}
}


测试结果
班长处理了学生0拉肚子
---------
班长处理不了
老师处理了学生1骨折
---------
班长处理不了
老师处理不了
校长处理了学生2白血病
2
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics