责任链模式(Chain Of Responsibility)
Chain Of Responsibility?这种情况下,我们可以考虑将多个对象组成一条职责链,然后按照它们在职责链上的顺序一个一个地找出到底应该谁来负责处理。 理解职责
使用Chain of Responsibility模式可以推卸请求,直至找到合适的处理请求的对象,这样确实提高了程序的灵活性,但是会有一定的处理延迟:当然你也可以通过算法来定义处理的特殊路径,但是未免太多余麻烦:所以有的时候我们不如直接显示调用来提高灵活性。 UML
时序图:
Code
public class Question {
private int question_number;
public Question(int question_number) {
this.question_number = question_number;
}
public int getQuestion_number() {
return question_number;
}
@Override
public String toString() {
return "Question{" +
"question_number=" + question_number +
'}';
}
}
public abstract class SolveAnswer {
private String Solve_Name;
// 继承链者
private SolveAnswer next;
public SolveAnswer(String solve_Name) {
Solve_Name = solve_Name;
}
/**
* 设置需要推卸责任的对象
*/
public SolveAnswer setNext(SolveAnswer solveAnswer){
this.next=solveAnswer;
return next;
}
/**
* 解决问题的步骤
*/
public final void support(Question question){
if(solve(question)){
finish(question);
}else if(next!=null){
this.next.support(question);
}else{
fail(question);
}
}
/**
* 交给子类取解决
* @param question
* @return
*/
protected abstract boolean solve(Question question);
/**
*
* @param question
*/
private void finish(Question question) {
System.out.println(question+"能被解决"+this.toString()+".");
}
/**
*
* @param question
*/
private void fail(Question question) {
System.out.println(question+"不能被解决.");
}
@Override
public String toString() {
return "["+this.Solve_Name+ "]";
}
}
public class LimitSolve extends SolveAnswer {
private int limit;
public LimitSolve(String solve_Name,int limit) {
super(solve_Name);
this.limit=limit;
}
@Override
public boolean solve(Question question) {
if(question.getQuestion_number()<limit){
return true;
}else{
return false;
}
}
}
public class NoSolve extends SolveAnswer{
public NoSolve(String solve_Name) {
super(solve_Name);
}
@Override
public boolean solve(Question question) {
return false;
}
}
public class OddSolve extends SolveAnswer {
public OddSolve(String solve_Name) {
super(solve_Name);
}
@Override
public boolean solve(Question question) {
if(question.getQuestion_number()%2==1){
return true;
}else{
return false;
}
}
}
public class SpcialSolve extends SolveAnswer {
private int special;
public SpcialSolve(String solve_Name,int specalNum) {
super(solve_Name);
this.special=specalNum;
}
@Override
public boolean solve(Question question) {
if(question.getQuestion_number()==special){
return true;
}else {
return false;
}
}
}
public class MainT {
public static void main(String[] args) {
SolveAnswer tom=new NoSolve("cat1");
SolveAnswer tom2=new LimitSolve("cat2",100);
SolveAnswer tom3=new OddSolve("cat3");
//只能解决225问题
SolveAnswer tom4=new SpcialSolve("cat4",225);
tom.setNext(tom2).setNext(tom3).setNext(tom4);
for (int i = 0; i < 300; i+=3) {
tom.support(new Question(i));
}
}
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


