java设计模式:责任链模式

责任链模式

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


下面通过一个生活中的事例比如“申请折扣”来说明责任链模式。
你去买房子或买车,全款买的,所以想申请一个折扣,如果只是5%以内的折扣,普通的销售人员估计就能批准,但是如果你买的更多,想申请更大的折扣20%或30%等等,这就不是普通销售人员有权做决定的,这个“申请折扣”的请求必将上传,交给更上级的人处理请求。


客户类

//客户,申请折扣
public class Customer {
	private PriceHandler pricehandler;
	
	public void setPricehandler(PriceHandler pricehandler) {
		this.pricehandler = pricehandler;
	}

	public void requestDiscount(float discount){
		pricehandler.processDiscount(discount);//处理折扣请求
	}
	public static void main(String[] args) {
		Customer customer = new Customer();
		//设置customer的接待人员(sales)
		customer.setPricehandler(PiceHandlerFactory.createPriceHandler());
		Random rand=new Random();
		//申请10次折扣
		for(int i=1;i<=10;i++){
			System.out.print(i+":");
			customer.requestDiscount(rand.nextFloat());
		}
	}
}

处理者抽象类

/*
 * 价格处理人,负责处理客户折扣申请
 */
public abstract class PriceHandler {
	protected PriceHandler successor;//后继,相当于链表中的后继,用于传递请求

	public void setSuccessor(PriceHandler successor) {
		this.successor = successor;
	}
	/*
	 * 处理折扣申请
	 */
	abstract public void processDiscount(float discount);
	
	
}


构造责任链类

public class PiceHandlerFactory {
	//为handler构造整个责任链(工厂函数)
	public static PriceHandler createPriceHandler() {
		PriceHandler sales=new Sales();
		PriceHandler lead = new Lead();
		PriceHandler Man=new Manager();
		PriceHandler dir=new Director();
		PriceHandler vp=new VicePresident();
		PriceHandler ceo=new CEO();
		sales.setSuccessor(lead);   //设置后继
		lead.setSuccessor(Man);
		Man.setSuccessor(dir);
		dir.setSuccessor(vp);
		vp.setSuccessor(ceo);
		return sales;
	}
}

Manager类

//销售经理,可以批准30%以内的折扣
public class Manager extends PriceHandler {

	@Override
	public void processDiscount(float discount) {
		if(discount<=0.3){
			System.out.format("%s批准了折扣:%.2f%n",this.getClass().getName(),discount);
		}else{
			successor.processDiscount(discount);
		}

	}

}

其他处理类就不一一贴出来了,只是批准折扣不一样。


Customer类main函数运行结果



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值