[原创]设计模型探索F-Chain of resposibility parttern 之击鼓传花
责任链模式
在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使系统可以在不影响客户端的情况下动态的重新组织链和分配责任。
责任链模式的组成部份
1.抽象处理者 定义出一个处理请求的接口。如果需要,接口可以定义出一个方法,以设定和返回下家的引用。这个角色通常由一个Java抽象类或Java接口实现。
2.具体处理 具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于处理者持有下家引用,因此,如果需要,具体处理者可以访问下家。
责任链模式组成部份之间的关系
一个例子:
1.抽象处理者
环境:
纯的与不纯的责任链
在一个纯的责任链模式里面,一个请求必须被某一个处理者对象所接收;在一个不纯的责任链模式里面,一个请求可以最终不被任何接收端对象所接收。
在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使系统可以在不影响客户端的情况下动态的重新组织链和分配责任。
责任链模式的组成部份
1.抽象处理者 定义出一个处理请求的接口。如果需要,接口可以定义出一个方法,以设定和返回下家的引用。这个角色通常由一个Java抽象类或Java接口实现。
2.具体处理 具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于处理者持有下家引用,因此,如果需要,具体处理者可以访问下家。
责任链模式组成部份之间的关系
一个例子:
1.抽象处理者
package
responsibility;
public abstract class Handler
{
protected Handler nextHandler;
public abstract void handleRequest(String name);
public void setNextHandler(Handler handler)
{
this.nextHandler = handler;
}
}
2.宝玉
public abstract class Handler
{
protected Handler nextHandler;
public abstract void handleRequest(String name);
public void setNextHandler(Handler handler)
{
this.nextHandler = handler;
}
}
package
responsibility;
/** */ /**
* <ul>
* <li>Title:[JiaBaoYu]</li>
* <li>Description: [贾宝玉]</li>
* <li>Copyright 2009 Upengs Co., Ltd.</li>
* <li>All right reserved.</li>
* <li>Created by [Huyvanpull] [2011-7-31]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
* @version 1.0
*/
public class JiaBaoYu extends Handler
{
public void handleRequest(String name)
{
if("贾宝玉".equals(name))
{
System.out.println("贾宝玉表演节目");
}
else
{
System.out.println("贾宝玉传把花递给下一位");
if (nextHandler != null)
{
this.nextHandler.handleRequest(name);
}
}
}
}
林黛玉:
/** */ /**
* <ul>
* <li>Title:[JiaBaoYu]</li>
* <li>Description: [贾宝玉]</li>
* <li>Copyright 2009 Upengs Co., Ltd.</li>
* <li>All right reserved.</li>
* <li>Created by [Huyvanpull] [2011-7-31]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
* @version 1.0
*/
public class JiaBaoYu extends Handler
{
public void handleRequest(String name)
{
if("贾宝玉".equals(name))
{
System.out.println("贾宝玉表演节目");
}
else
{
System.out.println("贾宝玉传把花递给下一位");
if (nextHandler != null)
{
this.nextHandler.handleRequest(name);
}
}
}
}
package
responsibility;
/** */ /**
* <ul>
* <li>Title:[LinDaiYu]</li>
* <li>Description: [林戴玉]</li>
* <li>Copyright 2009 Upengs Co., Ltd.</li>
* <li>All right reserved.</li>
* <li>Created by [Huyvanpull] [2011-7-31]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
* @version 1.0
*/
public class LinDaiYu extends Handler
{
public void handleRequest(String name)
{
if("林戴玉".equals(name))
{
System.out.println("林戴玉表演节目");
}
else
{
System.out.println("林戴玉把花传递给下一位");
if (nextHandler != null)
{
this.nextHandler.handleRequest(name);
}
}
}
}
探春:
/** */ /**
* <ul>
* <li>Title:[LinDaiYu]</li>
* <li>Description: [林戴玉]</li>
* <li>Copyright 2009 Upengs Co., Ltd.</li>
* <li>All right reserved.</li>
* <li>Created by [Huyvanpull] [2011-7-31]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
* @version 1.0
*/
public class LinDaiYu extends Handler
{
public void handleRequest(String name)
{
if("林戴玉".equals(name))
{
System.out.println("林戴玉表演节目");
}
else
{
System.out.println("林戴玉把花传递给下一位");
if (nextHandler != null)
{
this.nextHandler.handleRequest(name);
}
}
}
}
package
responsibility;
/** */ /**
* <ul>
* <li>Title:[TanChun]</li>
* <li>Description: [探春]</li>
* <li>Copyright 2009 Upengs Co., Ltd.</li>
* <li>All right reserved.</li>
* <li>Created by [Huyvanpull] [2011-7-31]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
*
* @version 1.0
*/
public class TanChun extends Handler
{
public void handleRequest(String name)
{
if ("探春".equals(name))
{
System.out.println("探春表演节目");
}
else
{
System.out.println("探春把花传递给下一位");
if (nextHandler != null)
{
nextHandler.handleRequest(name);
}
}
}
}
袭人:
/** */ /**
* <ul>
* <li>Title:[TanChun]</li>
* <li>Description: [探春]</li>
* <li>Copyright 2009 Upengs Co., Ltd.</li>
* <li>All right reserved.</li>
* <li>Created by [Huyvanpull] [2011-7-31]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
*
* @version 1.0
*/
public class TanChun extends Handler
{
public void handleRequest(String name)
{
if ("探春".equals(name))
{
System.out.println("探春表演节目");
}
else
{
System.out.println("探春把花传递给下一位");
if (nextHandler != null)
{
nextHandler.handleRequest(name);
}
}
}
}
package
responsibility;
/** */ /**
* <ul>
* <li>Title:[XiRen]</li>
* <li>Description: [袭人]</li>
* <li>Copyright 2009 Upengs Co., Ltd.</li>
* <li>All right reserved.</li>
* <li>Created by [Huyvanpull] [2011-7-31]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
* @version 1.0
*/
public class XiRen extends Handler
{
public void handleRequest(String name)
{
if("袭人".equals(name))
{
System.out.println("袭人表演节目");
}
else
{
System.out.println("袭人把花传递给下一位");
if (nextHandler != null)
{
this.nextHandler.handleRequest(name);
}
}
}
}
/** */ /**
* <ul>
* <li>Title:[XiRen]</li>
* <li>Description: [袭人]</li>
* <li>Copyright 2009 Upengs Co., Ltd.</li>
* <li>All right reserved.</li>
* <li>Created by [Huyvanpull] [2011-7-31]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
* @version 1.0
*/
public class XiRen extends Handler
{
public void handleRequest(String name)
{
if("袭人".equals(name))
{
System.out.println("袭人表演节目");
}
else
{
System.out.println("袭人把花传递给下一位");
if (nextHandler != null)
{
this.nextHandler.handleRequest(name);
}
}
}
}
环境:
package
responsibility;
public class Client
{
public static void main(String[] args)
{
// 贾宝玉
Handler jiabaoyu = new JiaBaoYu();
// 林黛玉
Handler lindaiyu = new LinDaiYu();
// 袭人
Handler xiren = new XiRen();
// 探春
Handler tanchun = new TanChun();
jiabaoyu.setNextHandler(lindaiyu);
lindaiyu.setNextHandler(xiren);
xiren.setNextHandler(tanchun);
jiabaoyu.handleRequest("贾宝玉");
}
}
public class Client
{
public static void main(String[] args)
{
// 贾宝玉
Handler jiabaoyu = new JiaBaoYu();
// 林黛玉
Handler lindaiyu = new LinDaiYu();
// 袭人
Handler xiren = new XiRen();
// 探春
Handler tanchun = new TanChun();
jiabaoyu.setNextHandler(lindaiyu);
lindaiyu.setNextHandler(xiren);
xiren.setNextHandler(tanchun);
jiabaoyu.handleRequest("贾宝玉");
}
}
纯的与不纯的责任链
在一个纯的责任链模式里面,一个请求必须被某一个处理者对象所接收;在一个不纯的责任链模式里面,一个请求可以最终不被任何接收端对象所接收。
责任链模式的优点
责任链模式非常显著的优点是请求和处理分开。请求者可以不用知道是谁处理的,处理者可以不用知道请求的全貌(例如在J2EE项目开发中,可以剥离出无状态Bean由责任链处理),两者解耦,提高系统的灵活性。
责任链模式的缺点
责任链有两个非常显著的缺点:一是性能问题,每个请求都是从链头遍历到链尾,特别是在链比较长的时候,性能是一个非常大的问题。二是调试不是很方便,特别是链条比较长,环节比较多的时候,由于采用了类似递归的方式,调试的时候逻辑可能比较复杂。