责任链模式

责任链模式

定义 使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。
    将这些对象连城一条链传递该请求直到有对象处理它为止。

责任链模式的使用场景

对个对象可以处理同一请求,但具体由哪个对象处理则在运行时动态决定。
在请求处理者不明确的情况下向多个对象中的一个提交一个请求。
需要动态指定一组对象处理请求

通过一个简单的例子来看看责任链模式的简单实现

我们在公司出差的时候产生的费用回去的时候呢 需要报销的 但是每个级别的领导处理报销的额度又是不一样的
这时我们就可以使用责任链模式  将这些人连成一条线  一个接一个的传递直到有人能给我们报销为止

//抽象请求类  主要是返回需要报销多少钱
public abstract class AbstractMoney {
    private int totalMoney;

    public AbstractMoney(int totalMoney) {
        this.totalMoney = totalMoney;
    }

    public int getTotalMoney() {
        return totalMoney;
    }
}   


//抽象领导类  主要是处理报销

public abstract class AbstractManager {
    public AbstractManager abstractManager;

    //抽象类中实现  判断当前领导能不能去处理
    public void handleMonry(AbstractMoney abstractMoney){
        if(getManagerTotalMoney() >= abstractMoney.getTotalMoney()) {
            handle(abstractMoney);
        }else {
            /**
             * 如果不能处理且abstractManager不为空则交给下一个经理去处理
             * 否则返回信息 不能处理
             */
            if(abstractManager != null) {
                abstractManager.handleMonry(abstractMoney);
            }else {
                System.out.println("抱歉,您的问题无人能处理,我们正在上报,请您耐心等候,谢谢");
            }

        }
    }

    /**
     * 获取经理的处理能力
     * @return
     */
    public abstract int getManagerTotalMoney();

    /**
     * 处理事情  (子类自己去实现)
     * @return
     */
    public abstract int handle(AbstractMoney abstractMoney); 
}

//具体 组长类 最低级的领导 处理额度只有 5000

public class GroupManager extends AbstractManager {

    @Override
    public int getManagerTotalMoney() {
        // TODO Auto-generated method stub
        return 5000;
    }

    @Override
    public int handle(AbstractMoney abstractMoney) {
        // TODO Auto-generated method stub
        System.out.println(this.getClass().getSimpleName().toString()+"已经处理了您的请求");
        return abstractMoney.getTotalMoney();
    }

}

//部门经理  中级领导吧   处理额度 20000


public class AndroidManager extends AbstractManager {

    @Override
    public int getManagerTotalMoney() {
        // TODO Auto-generated method stub
        return 20000;
    }

    @Override
    public int handle(AbstractMoney abstractMoney) {
        // TODO Auto-generated method stub
        System.out.println(this.getClass().getSimpleName().toString()+"已经处理了您的请求");
        return abstractMoney.getTotalMoney();
    }

}

//技术老大  高级领导  处理额度 50000

public class TechnologyManager extends AbstractManager {

    @Override
    public int getManagerTotalMoney() {
        // TODO Auto-generated method stub
        return 50000;
    }

    @Override
    public int handle(AbstractMoney abstractMoney) {
        // TODO Auto-generated method stub
        System.out.println(this.getClass().getSimpleName().toString()+"已经处理了您的请求");
        return abstractMoney.getTotalMoney();
    }

}

//实际请求类  (这么简单的逻辑这个类其实并不需要)

public class TripMoney extends AbstractMoney {

    /**
     * @param totalMoney
     */
    public TripMoney(int totalMoney) {
        super(totalMoney);
    }

}   


//这个类实现主要的操作 将领导们连城一条线
public class EngineMoney {
    private AbstractMoney abstractMoney;
    private int money;
    private AbstractManager groupManager;
    private AbstractManager androidManager;
    private AbstractManager technologyManager;
    /**
     * @param money
     */
    public EngineMoney(int money) {
        super();
        this.money = money;
        abstractMoney = new TripMoney(money);
        init();
    }
    /**
     * 初始化领导
     */
    private void init() {
        // TODO Auto-generated method stub
        groupManager = new GroupManager();
        androidManager = new AndroidManager();
        technologyManager = new TechnologyManager();
        groupManager.abstractManager = androidManager;
        androidManager.abstractManager = technologyManager;
    }

    public void startHandle() {
        groupManager.handleMonry(abstractMoney);
    }

}   

//员工类

public class Worker {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        EngineMoney engineMoney = new EngineMoney(60000);
        engineMoney.startHandle();
    }

}

总结一下 

     优点: 可以对请求者和处理者关系解耦 提高代码的灵活性

 缺点: 对链中的请求处理者要进行遍历 如果处理者太多那么遍历必定会影响性能
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值