责任链模式

2018-01-27  本文已影响25人  yangzai

根据UML图,我们首先要抽象出一个决策人类.这个对象抽象出处理请求的方法跟设置下一个决策人的方法
抽象决策人:

public abstract class Approver {
     Approver successor;
     String Name;
    public Approver(String Name){
        this.Name=Name;
    }
    public abstract void ProcessRequest( PurchaseRequest request);
    public void SetSuccessor(Approver successor) {
        this.successor=successor;
    }
}

组长:

public class GroupApprover extends Approver {
    public GroupApprover(String Name) {
        super(Name+" GroupLeader");     
    }
    //处理请求
    @Override
    public void ProcessRequest(PurchaseRequest request) {
        if (request.GetSum() < 5000) {//满足一定条件才自己处理,否则交给下一个处理器
            System.out.println("**This request " + request.GetID() + " will be handled by " + this.Name + " **");
        } else {
            //交给下一个处理器
            successor.ProcessRequest(request);
        }
    }
}

部门长:

public class DepartmentApprover extends Approver {
    public DepartmentApprover(String Name) {
        super(Name + " DepartmentLeader");
    }
    @Override
    public void ProcessRequest(PurchaseRequest request) {
        if ((5000 <= request.GetSum()) && (request.GetSum() < 10000)) {
            System.out.println("**This request " + request.GetID()
                    + " will be handled by " + this.Name + " **");
        } else {
            successor.ProcessRequest(request);
        }
    }
}

副总

public class VicePresidentApprover extends Approver {
    public VicePresidentApprover(String Name) {
        super(Name + " Vice President");
    }
    @Override
    public void ProcessRequest(PurchaseRequest request) {
        if ((10000 <= request.GetSum()) && (request.GetSum() < 50000)) {
            System.out.println("**This request " + request.GetID()
                    + " will be handled by " + this.Name + " **");
        } else {
            successor.ProcessRequest(request);
        }
    }
}

总裁:

public class PresidentApprover extends Approver {
    public PresidentApprover(String Name) {
        super(Name + " President");
    }
    @Override
    public void ProcessRequest(PurchaseRequest request) {
        if (50000 <= request.GetSum()) {
            System.out.println("**This request " + request.GetID()
                    + " will be handled by " + this.Name + " **");
        }else {
            successor.ProcessRequest(request);
        }
    }
}

待处理的请求:

public class PurchaseRequest {
    private int Type = 0;
    private int Number = 0;
    private float Price = 0;
    private int ID = 0;
    public PurchaseRequest(int Type, int Number, float Price) {
        this.Type = Type;
        this.Number = Number;
        this.Price = Price;
    }
    public int GetType() {
        return Type;
    }
    public float GetSum() {
        return Number * Price;
    }
    public int GetID() {
        return (int) (Math.random() * 1000);
    }
}

客户端发送请求:

public class Client {
    public Client() {}
    public PurchaseRequest sendRequst(int Type, int Number, float Price) {
        return new PurchaseRequest(Type, Number, Price);
    }
}

测试:

public class MainTest {
    public static void main(String[] args) {    
        Client mClient=new Client();
        Approver GroupLeader=new GroupApprover("Tom");
        Approver DepartmentLeader=new DepartmentApprover("Jerry");
        Approver VicePresident=new VicePresidentApprover("Kate");
        Approver President=new PresidentApprover("Bush");
        
        GroupLeader.SetSuccessor(VicePresident);
        DepartmentLeader.SetSuccessor(President);
        VicePresident.SetSuccessor(DepartmentLeader);
        President.SetSuccessor(GroupLeader);
        
        VicePresident.ProcessRequest(mClient.sendRequst(1, 100, 40));
        VicePresident.ProcessRequest(mClient.sendRequst(2, 200, 40));
        VicePresident.ProcessRequest(mClient.sendRequst(3, 300, 40));
        VicePresident.ProcessRequest(mClient.sendRequst(4, 400, 140));
    }
}

执行结果:

**This request 712 will be handled by Tom GroupLeader **
**This request 589 will be handled by Jerry DepartmentLeader **
**This request 667 will be handled by Kate Vice President **
**This request 855 will be handled by Bush President **
上一篇 下一篇

猜你喜欢

热点阅读