デューティチェーン。
定義
オブジェクトの複数の要求の送信者と受信者との間の結合を回避するために、要求を処理する機会。オブジェクトは、チェーンに接続され、オブジェクトは、これまでそれを処理するまで、チェーンに沿って要求を渡しています。
UMLダイアグラム
ベネフィット
- クライアントが要求を送信すると、要求はオブジェクトハンドルConcreteHandlerそれまで連鎖に沿って渡されます
- 受信機と送信者は明確な情報を持つ他の政党を持たない、とチェーンオブジェクト自体は、鎖の構造を知りません。相互接続されたオブジェクトの結果は、責任の連鎖を単純化すると、彼らは彼のすべての候補者は、受信者を引用しておくすることなく、その後継への参照を保持する必要があります。
- あなたは増加または任意の時点で要求の構造を変更し、オブジェクトに責任を割り当てるの柔軟性を高めることができます
しかし、そのノート:要求はチェーンの最後に思われるが扱われていない、または治療が適切に設定されていないためを得ることができません。
栗のために
従業員が昇給を申請するには、プロセスを取る必要があります
話は安いです、私のコードを表示します
(くそ以下、アップグレーディング)
/**
* 管理者
* Created by callmeDevil on 2019/12/14.
*/
public abstract class Manager {
protected String name;
// 上级
protected Manager superior;
public Manager(String name){
this.name = name;
}
// 设置上级
public void setSuperior(Manager superior){
this.superior = superior;
}
// 申请请求
public abstract void requestApplications(Request request);
}
/**
* 经理
* Created by callmeDevil on 2019/12/14.
*/
public class CommonManager extends Manager {
public CommonManager(String name) {
super(name);
}
@Override
public void requestApplications(Request request) {
// 经理的权限可以批准2天内的假期
if ("请假".equals(request.getRequestType()) && request.getNumber() <= 2) {
System.out.println(String.format("%s : %s 数量%s 被批准", name, request.getRequestContent(), request.getNumber()));
} else {
// 其余申请转交上级
if (superior != null) {
superior.requestApplications(request);
}
}
}
}
/**
* 总监
* Created by callmeDevil on 2019/12/14.
*/
public class Majordomo extends Manager {
public Majordomo(String name) {
super(name);
}
@Override
public void requestApplications(Request request) {
// 总监的权限可以批准5天内的假期
if ("请假".equals(request.getRequestType()) && request.getNumber() <= 5) {
System.out.println(String.format("%s : %s 数量%s 被批准", name, request.getRequestContent(), request.getNumber()));
} else {
// 其余申请转交上级
if (superior != null) {
superior.requestApplications(request);
}
}
}
}
/**
* 总经理
* Created by callmeDevil on 2019/12/14.
*/
public class GeneralManager extends Manager {
public GeneralManager(String name) {
super(name);
}
@Override
public void requestApplications(Request request) {
// 总经理可以批准任意天的假期
if ("请假".equals(request.getRequestType())) {
System.out.println(String.format("%s : %s 数量%s 被批准", name, request.getRequestContent(), request.getNumber()));
}
// 加薪在500内,没问题
else if ("加薪".equals(request.getRequestType()) && request.getNumber() <= 500) {
System.out.println(String.format("%s : %s 数量%s 被批准", name, request.getRequestContent(), request.getNumber()));
}
// 加薪超过500要考虑一下
else if ("加薪".equals(request.getRequestType()) && request.getNumber() > 500) {
System.out.println(String.format("%s : %s 数量%s 再说吧", name, request.getRequestContent(), request.getNumber()));
}
}
}
/**
* 申请类
* Created by callmeDevil on 2019/12/14.
*/
public class Request {
// 申请级别
private String requestType;
// 申请内容
private String requestContent;
// 数量
private int number;
// 省略get set
}
public class Test {
public static void main(String[] args) {
CommonManager commonManager = new CommonManager("中将");
Majordomo majordomo = new Majordomo("大将");
GeneralManager generalManager = new GeneralManager("元帅");
// 设置上级
commonManager.setSuperior(majordomo);
majordomo.setSuperior(generalManager);
Request request = new Request();
request.setRequestType("请假");
request.setRequestContent("不给请假我不干了");
request.setNumber(1);
commonManager.requestApplications(request); // 客户端的申请都是由经理发起的,但实际上决策是谁,客户端不知道
Request request2 = new Request();
request2.setRequestType("请假");
request2.setRequestContent("不给请假我不干了");
request2.setNumber(4);
commonManager.requestApplications(request2);
Request request3 = new Request();
request3.setRequestType("加薪");
request3.setRequestContent("不给加薪我不干了");
request3.setNumber(500);
commonManager.requestApplications(request3);
Request request4 = new Request();
request4.setRequestType("加薪");
request4.setRequestContent("不给加薪我不干了");
request4.setNumber(1000);
commonManager.requestApplications(request4);
}
}
業績
中将 : 不给请假我不干了 数量1 被批准
大将 : 不给请假我不干了 数量4 被批准
元帅 : 不给加薪我不干了 数量500 被批准
元帅 : 不给加薪我不干了 数量1000 再说吧