Java中的23中设计模式也许我们都知道但是理解的不是很深,每一种设计模式都有它存在的意义,需要我们去理解,今天就写下自己对责任链模式的理解。
也许我们不会一个个去深入理解每一种设计模式,但是作为一名安卓开发,在自己安卓中用到的一些知识就是和Java中的知识点紧密相关的。为什么会记录下这篇文章呢?因为安卓中的事件分发机制大家再熟悉不过了的,其实事件分发机制就是Java中责任链模式的影子,所以就进行了研究。
什么是责任链模式?
在阎宏博士的《Java设计模式》一书中开头是这样描述责任链(Chain of Responsibility)模式的:
责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。
用一张图片来加深理解:
1 有相关的请求(对应图中的handleRequest());
2 有人发起请求(对应图中的Client);
3 有人处理请求(对应图中的ConcretaHandler1 ConcretaHandler1.......)
4 责任链。这条链是怎么形成的呢?是successor将处理请求的人串了起来。
通过图解再加上生活化的分析我们知道处理请求的角色不止一个,可能是多个,那么他们任何一个人都可以处理请求,他们要处理请求的话必须要先知道请求,那就是每个角色都要清楚知道请求是什么而且都还有是否处理请求的机会,那我们怎么保证每个角色都知道请求是什么呢?怎么保证每个角色都有机会处理请求呢?大家可以在脑海中想一想。。。好了,可以通过接口或者抽象来实现。这里更加适合抽象来实现,抽象的里面吧请求和请求处理的方法抛出来,然后让要处理的请求的人去继承抽象类就达到目的了。
下面我们来看看代码实现:
生活中的责任链应用的场景很多的:击鼓传花,你向领导请假找领导签字,客户买房子要求折扣不同的级别给出的折扣不一样。。。。这些我不细说了,大家应该都懂得的,下面就拿客户买房子的场景来写一个责任链模式。
先看下项目结构:
抽象类:
package chain;
/**
*
* @author admin
* 责任链模式 Chain of Responsibility Pattern
*/
public abstract class PriceHandler {
protected PriceHandler succesor;
public void setHandler(PriceHandler hPriceHandler) {
this.succesor = hPriceHandler;
}
public abstract void handleRequest(double discount) ;
}
底层销售:
package chain;
/**
*
* @author admin 底层销售
*
*/
public class SalesMan extends PriceHandler {
public SalesMan() {
System.out.println("SalesMan被调用了");
}
@Override
public void handleRequest(double discount) {
if (discount <= 0.10) {
// 能处理就自己处理
System.out.println("销售人员:" + this.getClass().getName() + "处理了");
} else {
// 不能处理就抛出去
succesor.handleRequest(discount);
}
}
}
销售组长:
package chain;
/**
*
* @author admin 销售组长
*
*/
public class Leader extends PriceHandler {
public Leader() {
System.out.println("Leader被调用了");
}
@Override
public void handleRequest(double discount) {
if (discount <= 0.20) {
// 能处理就自己处理
System.out.println("销售组长:" + this.getClass().getName() + "处理了");
} else {
// 不能处理就抛出去
succesor.handleRequest(discount);
}
}
}
销售总管:
package chain;
/**
*
* @author admin 销售总管
*
*/
public class ChiefManager extends PriceHandler{
@Override
public void handleRequest(double discount) {
if (discount <= 0.30) {
//能处理就自己处理
System.out.println("销售总管:"+this.getClass().getName()+"处理了");
} else {
//不能处理就抛出去
succesor.handleRequest(discount);
}
}
}
CEO:
package chain;
/**
*
* @author admin CEO
*
*/
public class CEO extends PriceHandler{
@Override
public void handleRequest(double discount) {
if (discount <= 0.40) {
//能处理就自己处理
System.out.println("CEO:"+this.getClass().getName()+"处理了");
} else {
//不能处理就抛出去 已经是最高级了
System.out.println("CEO:"+"草泥马,不买滚蛋!!!!!!");
}
}
}
客户需要找到销售人员(工厂模式创建对象):
package chain;
/**
*
* @author admin 工厂模式创建对象
*/
public class PriceHandlerFactory {
public static PriceHandler createHandler() {
SalesMan salesMan = new SalesMan();
Leader leader = new Leader();
ChiefManager chiefManager = new ChiefManager();
CEO ceo = new CEO();
// 链式关联
salesMan.setHandler(leader);
leader.setHandler(chiefManager);
chiefManager.setHandler(ceo);
return salesMan;
}
}
客户买房子要求打折:
package text;
import chain.PriceHandler;
import chain.PriceHandlerFactory;
/**
*
* @author admin 请求的发出者
*/
public class Customer {
public static void main(String[] args) {
PriceHandler createHandler = PriceHandlerFactory.createHandler();
createHandler.handleRequest(0.1);
createHandler.handleRequest(0.2);
createHandler.handleRequest(0.3);
createHandler.handleRequest(0.4);
createHandler.handleRequest(0.5);
}
}
以上模拟了一个客户买东西要求打折,分别要求打5折6折7折8折9折的要求,但是每个处理请求的人的权限不一样。。。
下面来看打印结果:
好了,折就是整个责任链模式的实现!
大家也可以想哈责任链模式的优缺点.......
稍微题提一下:如果我只要求打9折的话,那么底层销售就可以做主了,那就没必要告知上面的领导了,也就是我们只需要创建底层销售的对象即可,但是代码中吧所有的对象都创建了,但是很多对象用不上,这就导致了内存的浪费了......还有,如果我要求打5折的话,底层销售根本处理不了,但是他还接过这个请求他处理不了还传给下一个还是处理不了最后一层层传到CEO.....其实这是很浪费时间的不是吗?这个请求只需要CEO处理就好了,因为只有CEO有这个权限。当然,这种模式的优点就是耦合度低,客户并不知道谁的权限的大或者小,他只要求他的结果,具体你们怎么处理他不管....反正,有优点也有缺点,具体使用看自己的应用场景吧!