1.天然的责任链:公司的层级结构
sales-manager-director-vice pesident-ceo
2.责任链模式:将接受者对象连成一条链,并在该链上传递请求,直到有一个接受者对象处理它。
通过让更多对象有机会处理请求,避免了请求发送者和接受者之间的耦合
3.责任链模式图
发送的客户端代码并不知道链上的哪个接收者会处理这个请求,从而实现了客户端和接收者之间的解耦
4,.好处
开闭原则:新增开放,修改关闭
执行性能:创建多个处理器对象,其实只是少数处理器对象会用到
5.应用
package com.imooc.pattern.cor.handler;
//价格处理人,负责处理客户折扣申请
public abstract class PriceHandler {
/**
* 直接后继,用于传递请求
*/
protected PriceHandler successor;
public void setSuceessor(PriceHandler successor) {
this.successor = successor;
}
/**
* 处理折扣申请
*/
public abstract void processDiscount(float discount);
}
package com.imooc.pattern.cor.handler;
public class Sales extends PriceHandler {
@Override
public void processDiscount(float discount) {
if(discount < 0.05){
System.out.format("%s批准了折扣:%.2f%n", this.getClass().getName(),discount);
}else{
successor.processDiscount(discount);
}
}
}
package com.imooc.pattern.cor.handler;
public class Lead extends PriceHandler {
@Override
public void processDiscount(float discount) {
if(discount < 0.15){
System.out.format("%s批准了折扣:%.2f%n", this.getClass().getName(),discount);
}else{
successor.processDiscount(discount);
}
}
}
package com.imooc.pattern.cor.handler;
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);
}
}
}
package com.imooc.pattern.cor.handler;
public class Director extends PriceHandler {
@Override
public void processDiscount(float discount) {
if(discount < 0.15){
System.out.format("%s批准了折扣:%.2f%n", this.getClass().getName(),discount);
}else{
successor.processDiscount(discount);
}
}
}
package com.imooc.pattern.cor.handler;
public class VicePresident extends PriceHandler {
@Override
public void processDiscount(float discount) {
if(discount < 0.5){
System.out.format("%s批准了折扣:%.2f%n", this.getClass().getName(),discount);
}else{
successor.processDiscount(discount);
}
}
}
package com.imooc.pattern.cor.handler;
public class PriceHandlerFactory {
/**
* 创建priceHandler的工厂方法
* @return
*/
public static PriceHandler createPriceHandler() {
PriceHandler sales = new Sales();
PriceHandler lead = new Lead();
PriceHandler man = new Manager();
PriceHandler director = new Director();
PriceHandler vp = new VicePresident();
PriceHandler ceo = new Ceo();
sales.setSuceessor(lead);
lead.setSuceessor(man);
man.setSuceessor(director);
director.setSuceessor(vp);
vp.setSuceessor(ceo);
return sales;
}
}
package com.imooc.pattern.cor;
import java.util.Random;
import com.imooc.pattern.cor.handler.PriceHandler;
import com.imooc.pattern.cor.handler.PriceHandlerFactory;
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.setPriceHandler(PriceHandlerFactory.createPriceHandler());
Random rand = new Random();
for(int i=0; i<100; i++){
System.out.println(i+":");
customer.requestDiscount(rand.nextFloat());
}
}
}