11.19

责任链模式:

定义:如果有多个对象有机会处理请求,责任链可使请求的发送者和接受者解耦,请求沿着责任链传递,直到有一个对象处理了它为止。

主要解决:职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。

举例(购买请求决策,价格不同要由不同的级别决定:组长、部长、副部、总裁)。

 决策者抽象类,包含对请求处理的函数,同时还包含指定下一个决策者的函数

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) {
        // TODO Auto-generated method stub
        this.successor=successor;
    }
}

客户端以及请求

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 GroupApprover extends Approver {
 
    public GroupApprover(String Name) {
        super(Name + " GroupLeader");
        // TODO Auto-generated constructor stub
 
    }
 
    @Override
    public void ProcessRequest(PurchaseRequest request) {
        // TODO Auto-generated method stub
 
        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) {
        // TODO Auto-generated method stub
 
        if ((5000 <= request.GetSum()) && (request.GetSum() < 10000)) {
            System.out.println("**This request " + request.GetID()
                    + " will be handled by " + this.Name + " **");
        } else {
            successor.ProcessRequest(request);
        }
 
    }
 
}
posted @ 2021-11-19 21:56  韩佳龙  阅读(41)  评论(0编辑  收藏  举报