基于java的设计模式(5)责任链模式

该文章是本人在慕课网学习责任链模式的一些笔记

责任链模式定义

将介绍者对象连成一条链,并在该链上传递请求,直到有一个接收者对象处理它。通过让更多对象有机会处理请求,避免了请求发送者和接收到之间的耦合。
责任链模式类图


demo:(销售打折)

package responsibility_chain.handler;


public abstract class PriceHandler {
//维护一个自身的类型的引用(后继),使得handler能够连接上
protected PriceHandler successor;



public void setSuccessor(PriceHandler successor) {
this.successor = successor;
}
/**
* 处理折扣
* @param dicount
*/
public abstract void processDiscount(float dicount);

public static PriceHandler createPriceHandler(){
return null;
}

}


package responsibility_chain.handler;


public class Sales extends PriceHandler {


@Override
public void processDiscount(float dicount) {
if(dicount<=0.05){
System.out.println("sales  ok 0.05以下");
}else{
this.successor.processDiscount(dicount);
}


}


}

package responsibility_chain.handler;


public class Sales extends PriceHandler {


@Override
public void processDiscount(float dicount) {
if(dicount<=0.05){
System.out.println("sales  ok 0.05以下");
}else{
this.successor.processDiscount(dicount);
}


}


}


package responsibility_chain.handler;


public class Director extends PriceHandler {


@Override
public void processDiscount(float dicount) {
if(dicount<=0.4){
System.out.println("Director ok 0.4以下");
}else{
this.successor.processDiscount(dicount);
}


}


}


package responsibility_chain.handler;


public class VicePresident extends PriceHandler {


@Override
public void processDiscount(float dicount) {
if(dicount<=0.5){
System.out.println("VicePresident ok 0.5以下");
}else{
this.successor.processDiscount(dicount);
}


}


}


package responsibility_chain.handler;


public class CEO extends PriceHandler {


@Override
public void processDiscount(float dicount) {
if(dicount<=0.55){
System.out.println("ceo ok 0.55以下");
}else{
System.out.println("没人能办理");
}


}


}


package responsibility_chain.handler;


public class PriceHandlerFactory {


public  static PriceHandler createHandler(){
Sales sale = new Sales();
Manager manager = new Manager();
Director director = new Director();
VicePresident vicePresident = new VicePresident();
CEO ceo = new CEO();

sale.successor=manager;
manager.successor=director;
director.successor=vicePresident;
vicePresident.successor=ceo;
return sale;
}
}


测试:

package responsibility_chain;


import java.util.Random;


import org.junit.Test;


import responsibility_chain.handler.PriceHandler;
import responsibility_chain.handler.PriceHandlerFactory;


public class test {
@Test
public void testHanler() {
Customer customer = new Customer();
PriceHandler handler = PriceHandlerFactory.createHandler();
customer.setPriceHandler(handler);
for (int i = 0; i < 30; i++) {
Random random = new Random();
float nextFloat = random.nextFloat();
System.out.println("随机数" + nextFloat);
customer.requestDiscount(nextFloat);
System.out.println("--------------------------------");
}

}
}


测试结果:(部分)

随机数0.02936542
sales  ok 0.05以下
--------------------------------
随机数0.026033878
sales  ok 0.05以下
--------------------------------
随机数0.4851563
VicePresident ok 0.5以下
--------------------------------
随机数0.3292818
Director ok 0.4以下
--------------------------------
随机数0.6695393
没人能办理
--------------------------------

所以简单的责任链模式就这样写成了。

下面就是一些来自慕课网的资料

优点

利于解耦

发出请求的客户端并不知道链上的哪一个接收者会处理这个请求,从而实现了客户端和接收者之间的解耦
缺点:

1.时间:在单个hander对象的时间很短,但是在遍历整条链时会花费较长的时间
2.内存:在创建整条链时,会创建很多类,导致内存增加

4-1 应用案例

Java的异常机制:Exception Handling

异常是请求,调用栈中的每一级是一个handler,
这些栈中的handler共同构建成一个责任链,
栈顶元素就是上一级元素的直接后继。

JavaWeb开发过滤器链:FileterChain in Web



fileter不是纯粹的责任链模式,因为在他可以多个filter同时工作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值