责任链模式
将接收者对象连成一条链,并在该链上传递请求,直到有一个接收者对象处理他,通过让更多对象有机会处理请求,避免了请求发送者和接收者之间的耦合。
下面通过一个生活中的事例比如“申请折扣”来说明责任链模式。
你去买房子或买车,全款买的,所以想申请一个折扣,如果只是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);
}
}
}
其他处理类就不一一贴出来了,只是批准折扣不一样。