java设计模式:责任链模式

来源:互联网 发布:星巴克糕点搭配知乎 编辑:程序博客网 时间:2024/06/18 00:01

责任链模式

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


下面通过一个生活中的事例比如“申请折扣”来说明责任链模式。
你去买房子或买车,全款买的,所以想申请一个折扣,如果只是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 {@Overridepublic void processDiscount(float discount) {if(discount<=0.3){System.out.format("%s批准了折扣:%.2f%n",this.getClass().getName(),discount);}else{successor.processDiscount(discount);}}}

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


Customer类main函数运行结果



原创粉丝点击