作用:这个可以参考SpringSecurity安全框架里面的多个Filter,使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这个对象连成一条链,并沿着这条链传递该请求,知道有一个对象处理它为止。
1、责任链模式
1、Handler抽象类
abstract class Handler{
protected Handler successor;
//设置继任者
public void setSuccessor(Handler successor){
this.successor = successor;
}
public abstract void handleRequest(int request);
}
2、Handler实现类
class ConcreteHandler1 extends Handler{
public void handleRequest(int request){
if (request >=0 && request < 10){
System.out.println(this.getClass().getSimpleName()+" 处理请求 "+request);
}
else if (successor != null){
successor.handleRequest(request);
}
}
}
class ConcreteHandler2 extends Handler{
public void handleRequest(int request){
if (request >=10 && request < 20){
System.out.println(this.getClass().getSimpleName()+" 处理请求 "+request);
}
else if (successor != null){
successor.handleRequest(request);
}
}
}
class ConcreteHandler3 extends Handler{
public void handleRequest(int request){
if (request >=20 && request < 30){
System.out.println(this.getClass().getSimpleName()+" 处理请求 "+request);
}
else if (successor != null){
successor.handleRequest(request);
}
}
}
3、测试和结果
public class Test {
public static void main(String[] args) {
System.out.println("**********************************************");
System.out.println("《大话设计模式》代码样例");
System.out.println();
Handler h1 = new ConcreteHandler1();
Handler h2 = new ConcreteHandler2();
Handler h3 = new ConcreteHandler3();
h1.setSuccessor(h2);
h2.setSuccessor(h3);
int[] requests = { 2, 5, 14, 22, 18, 3, 27, 20 };
for(int request : requests) {
h1.handleRequest(request);
}
System.out.println();
System.out.println("**********************************************");
}
}
结果
2、责任链模式使用
1、Handler抽象类
//管理者抽象类
abstract class Manager{
protected String name;
public Manager(String name){
this.name = name;
}
//设置管理者上级
protected Manager superior;
public void setSuperior(Manager superior){
this.superior = superior;
}
//请求申请
public abstract void requestApplications(Request request);
}
2、Handler实现类
//普通经理
class CommonManager extends Manager{
public CommonManager(String name){
super(name);
}
public void requestApplications(Request request){
if (request.getRequestType()=="请假" && request.getNumber()<=2)
System.out.println(this.name+":"+request.getRequestContent()+" 数量:"+request.getNumber()+"天,被批准");
else {
if (this.superior != null)
this.superior.requestApplications(request);
}
}
}
//总监
class Director extends Manager{
public Director(String name){
super(name);
}
public void requestApplications(Request request){
if (request.getRequestType()=="请假" && request.getNumber()<=5)
System.out.println(this.name+":"+request.getRequestContent()+" 数量:"+request.getNumber()+"天,被批准");
else {
if (this.superior != null)
this.superior.requestApplications(request);
}
}
}
//总经理
class GeneralManager extends Manager{
public GeneralManager(String name){
super(name);
}
public void requestApplications(Request request){
if (request.getRequestType()=="请假"){
System.out.println(this.name+":"+request.getRequestContent()+" 数量:"+request.getNumber()+"天,被批准");
}
else if (request.getRequestType()=="加薪" && request.getNumber()<=5000){
System.out.println(this.name+":"+request.getRequestContent()+" 数量:"+request.getNumber()+"元,被批准");
}
else if (request.getRequestType()=="加薪" && request.getNumber()>5000){
System.out.println(this.name+":"+request.getRequestContent()+" 数量:"+request.getNumber()+"元,再说吧");
}
}
}
3、申请类(不相关的类)
//申请
class Request {
//申请类别
private String requestType;
public String getRequestType(){
return this.requestType;
}
public void setRequestType(String value){
this.requestType = value;
}
//申请内容
private String requestContent;
public String getRequestContent(){
return this.requestContent;
}
public void setRequestContent(String value){
this.requestContent = value;
}
//数量
private int number;
public int getNumber(){
return this.number;
}
public void setNumber(int value){
this.number = value;
}
}
4、测试和结果
public class Test {
public static void main(String[] args) {
System.out.println("**********************************************");
System.out.println("《大话设计模式》代码样例");
System.out.println();
CommonManager manager = new CommonManager("金利");
Director director = new Director("宗剑");
GeneralManager generalManager = new GeneralManager("钟精励");
manager.setSuperior(director);
director.setSuperior(generalManager);
Request request = new Request();
request.setRequestType("请假");
request.setRequestContent("小菜请假");
request.setNumber(1);
manager.requestApplications(request);
Request request2 = new Request();
request2.setRequestType("请假");
request2.setRequestContent("小菜请假");
request2.setNumber(4);
manager.requestApplications(request2);
Request request3 = new Request();
request3.setRequestType("加薪");
request3.setRequestContent("小菜请求加薪");
request3.setNumber(5000);
manager.requestApplications(request3);
Request request4 = new Request();
request4.setRequestType("加薪");
request4.setRequestContent("小菜请求加薪");
request4.setNumber(10000);
manager.requestApplications(request4);
System.out.println();
System.out.println("**********************************************");
}
}
结果