一:责任链模式介绍
责任链模式(Chain of Responsibility)是Web项目中最经常用到的一个设计模式,比如有一个作业任务,先有一个对象对其负责处理,之后又交给其他的一个对象处理,一次传递下去,这是最通俗最简单的责任链模式的应用。
二:案例
假如客户买了某公司的一个产品,可是发现产品出了问题,于是打电话到部门A询问,部门A告诉他去问一下部门B,部门B再让他问一下部门C......
以此类推,最后部门Z终于给他解决了问题。
下面贴一下实现的代码,首先要有一系列的部门,这些部门就是责任链上的一系列类。
第一个是部门的基类:
1
/**
2
* 部门基类<br>
3
*
4
*/
5
public abstract class Department {
6
7
protected Department successor;
8
9
/**
10
* 处理方法,调用此方法处理请求
11
*/
12
public abstract void handleRequest();
13
14
/**
15
* 赋值方法,调用此方法设置下家
16
*
17
* @param successor
18
*/
19
public void setSuccessor(Department successor) {
20
this.successor = successor;
21
}
22
23
/**
24
* 取值方法,得到下家对象
25
*
26
* @return
27
*/
28
public Department getSuccessor() {
29
return successor;
30
}
31
}
/** 2
* 部门基类<br> 3
* 4
*/ 5
public abstract class Department { 6
7
protected Department successor; 8
9
/** 10
* 处理方法,调用此方法处理请求 11
*/ 12
public abstract void handleRequest(); 13
14
/** 15
* 赋值方法,调用此方法设置下家 16
* 17
* @param successor 18
*/ 19
public void setSuccessor(Department successor) { 20
this.successor = successor; 21
} 22
23
/** 24
* 取值方法,得到下家对象 25
* 26
* @return 27
*/ 28
public Department getSuccessor() { 29
return successor; 30
} 31
} 后边的部门子类都要继承这个类,然后覆盖handleRequest方法去处理用户请求,另外,successor是指如果这个部门不能处理的话,将请求转接给的下一个部门。
然后来看一个用户请求的抽象,部门的具体实现会用到,这里先列出来。这个类本质上不是cor的一个组成部分。
1
/**
2
* 客户发出的请求类型<br>
3
*
4
*/
5
public class Request {
6
public enum RequestType {
7
/** 产品错误 */
8
ProductError,
9
/** 功能使用 */
10
FunctionUsage,
11
/** 其他请求 */
12
Others
13
}
14
15
private RequestType type;
16
17
public Request(RequestType type) {
18
this.type = type;
19
}
20
21
public RequestType getType() {
22
return type;
23
}
24
25
}
/** 2
* 客户发出的请求类型<br> 3
* 4
*/ 5
public class Request { 6
public enum RequestType { 7
/** 产品错误 */ 8
ProductError, 9
/** 功能使用 */ 10
FunctionUsage, 11
/** 其他请求 */ 12
Others 13
} 14
15
private RequestType type; 16
17
public Request(RequestType type) { 18
this.type = type; 19
} 20
21
public RequestType getType() { 22
return type; 23
} 24
25
} 下面来看几个部门的具体实现:
/**
* 销售部门<br>
*
*/
public class SalesDepartment extends Department {
@Override
public void handleRequest(Request request) {
/* 判断请求的类型来决定哪种请求来自己处理,哪种抛给Successor */
if (request.getType() == Request.RequestType.FunctionUsage) {
System.out.println("SalesDepartment: The request is handled here.");
} else if (getSuccessor() != null) {
getSuccessor().handleRequest(request);
} else {
System.out.println("The request cannot be handled");
}
}
}
/**
* 开发部门<br>
*
*/
public class DevelopDepartment extends Department {
@Override
public void handleRequest(Request request) {
/* 判断请求的类型来决定哪种请求来自己处理,哪种抛给Successor */
if (request.getType() == Request.RequestType.ProductError) {
System.out.println("DevelopDepartment: The request is handled here.");
} else if (getSuccessor() != null) {
getSuccessor().handleRequest(request);
} else {
System.out.println("The request cannot be handled");
}
}
} 最后是调用它的客户端代码:
1
public class Client {
2
3
/**
4
* @param args
5
*/
6
public static void main(String[] args) {
7
Department sales = new SalesDepartment();
8
Department develop = new DevelopDepartment();
9
10
sales.setSuccessor(develop);
11
12
Request funcReq = new Request(Request.RequestType.FunctionUsage);
13
Request errorReq = new Request(Request.RequestType.ProductError);
14
Request otherReq = new Request(Request.RequestType.Others);
15
16
sales.handleRequest(funcReq);
17
sales.handleRequest(errorReq);
18
sales.handleRequest(otherReq);
19
}
20
21
}
这样,一个完整的责任链例子就写完了。
public class Client { 2
3
/** 4
* @param args 5
*/ 6
public static void main(String[] args) { 7
Department sales = new SalesDepartment(); 8
Department develop = new DevelopDepartment(); 9
10
sales.setSuccessor(develop); 11
12
Request funcReq = new Request(Request.RequestType.FunctionUsage); 13
Request errorReq = new Request(Request.RequestType.ProductError); 14
Request otherReq = new Request(Request.RequestType.Others); 15
16
sales.handleRequest(funcReq); 17
sales.handleRequest(errorReq); 18
sales.handleRequest(otherReq); 19
} 20
21
}
1594

被折叠的 条评论
为什么被折叠?



