責(zé)任重于泰山,咱再來看看責(zé)任鏈模式鳍鸵。
這里的責(zé)任我理解為兩種責(zé)任:
1)一種是自我責(zé)任苇瓣,自己的任務(wù),自己認(rèn)真做好偿乖,保證任務(wù)的質(zhì)量
2)另一種是整體責(zé)任击罪,當(dāng)不屬于自己的任務(wù),或是自己不能擔(dān)當(dāng)?shù)奶靶剑瑧?yīng)盡快交給能完成他的人媳禁,保證整體效率的提高
1. 定義
有點(diǎn)像流水線的模式,前一個(gè)流程處理完了画切,交給下一個(gè)流程處理竣稽,是一個(gè)自動(dòng)流程鏈處理的過程,要進(jìn)入整個(gè)流程很簡單霍弹,
只需要知道第一個(gè)流程節(jié)點(diǎn)的位置就可以毫别,且各個(gè)流程節(jié)點(diǎn)也不需要關(guān)心其他節(jié)點(diǎn)的處理過程。
注:可能存在某一次流水線過程典格,比如一共10個(gè)環(huán)節(jié)岛宦,而實(shí)際呢,只有5個(gè)環(huán)節(jié)參與了流程耍缴,這個(gè)就是要看具體加工的產(chǎn)品需要
哪個(gè)環(huán)節(jié)來處理砾肺。
2. 優(yōu)點(diǎn)
- 降低了處理對(duì)象與自身的關(guān)聯(lián)關(guān)系
- 擴(kuò)展性增加,需要增加處理流程時(shí)防嗡,隨時(shí)動(dòng)態(tài)增加到流程的具體位置即可
- 可以動(dòng)態(tài)調(diào)整節(jié)點(diǎn)变汪,包括更換位置、或是刪除
- 前后流程維護(hù)較方便本鸣,只需要保留后一個(gè)節(jié)點(diǎn)的引用即可
- 職責(zé)分工明確疫衩,各個(gè)節(jié)點(diǎn)只需要負(fù)責(zé)自己的處理即可
3. 缺點(diǎn)
- 請(qǐng)求處理的隨機(jī)性,可能被流程中的過程環(huán)節(jié)處理到荣德,也可能一個(gè)環(huán)節(jié)也沒有處理
- 如果流程環(huán)節(jié)較長闷煤,可能對(duì)系統(tǒng)性能有一定的影響
4. 結(jié)構(gòu)
- 抽象處理類:主要包括處理的抽象方法,及下一個(gè)流程節(jié)點(diǎn)的維護(hù)
- 具體處理類:具體的流程處理方法 涮瞻,大概包括:本節(jié)點(diǎn)是否需要執(zhí)行鲤拿,以及負(fù)責(zé)把流程流轉(zhuǎn)到下一個(gè)節(jié)點(diǎn)
- 客戶端:負(fù)責(zé)向流程的第一個(gè)處理節(jié)點(diǎn)發(fā)起請(qǐng)求,不需要關(guān)心后續(xù)的流程和處理過程
5. 實(shí)現(xiàn)
一般來說署咽,汽車生產(chǎn)分為4個(gè)環(huán)節(jié)近顷,沖壓生音、焊接、涂裝窒升、總裝缀遍。
當(dāng)然真實(shí)的流水線,是挨個(gè)順序來的饱须,當(dāng)然呢域醇,也有可能某一個(gè)零件是中間的一個(gè)步驟,下面的邏輯可以支持中間過程的零件生產(chǎn)蓉媳。
//處理抽象類
abstract class CarProducerHandler {
//下一個(gè)流程的引用
private CarProducerHandler next;
public CarProducerHandler getNext() {
return next;
}
public void setNext(CarProducerHandler next) {
this.next = next;
}
//處理請(qǐng)求的方法
public abstract void produceHandler(String request);
}
//沖壓環(huán)節(jié)
class StampingHandler extends CarProducerHandler {
@Override
public void produceHandler(String request) {
if(request.equals("stamping")) {
System.out.println("我來處理沖壓任務(wù)");
//這樣我們可以流轉(zhuǎn)到下一個(gè)環(huán)節(jié)進(jìn)行生產(chǎn)
getNext().produceHandler("welding");
}else {
if(getNext()!=null) {
getNext().produceHandler(request);
}else {
System.out.println("當(dāng)前無人處理請(qǐng)求");
}
}
}
}
//焊接環(huán)節(jié)
class WeldingHandler extends CarProducerHandler {
@Override
public void produceHandler(String request) {
if(request.equals("welding")) {
System.out.println("我來處理焊接任務(wù)");
getNext().produceHandler("painting");
}else {
if(getNext()!=null) {
getNext().produceHandler(request);
}else {
System.out.println("當(dāng)前無人處理請(qǐng)求");
}
}
}
}
//油漆環(huán)節(jié)
class PaintingHandler extends CarProducerHandler {
@Override
public void produceHandler(String request) {
if(request.equals("painting")) {
System.out.println("我來處理涂裝任務(wù)");
getNext().produceHandler("assembly");
}else {
if(getNext()!=null) {
getNext().produceHandler(request);
}else {
System.out.println("當(dāng)前無人處理請(qǐng)求");
}
}
}
}
//總裝環(huán)節(jié)
class AssemblyHandler extends CarProducerHandler {
@Override
public void produceHandler(String request) {
if(request.equals("assembly")) {
System.out.println("我來處理總裝任務(wù)譬挚,全結(jié)束");
}else {
if(getNext()!=null) {
getNext().produceHandler(request);
}else {
System.out.println("當(dāng)前無人處理請(qǐng)求");
}
}
}
}
public class ChainPatternTest {
public static void main(String[] args) {
//四大環(huán)節(jié)
StampingHandler stampingHandler = new StampingHandler();
WeldingHandler weldingHandler = new WeldingHandler();
PaintingHandler paintingHandler = new PaintingHandler();
AssemblyHandler assemblyHandler = new AssemblyHandler();
//建立四大環(huán)節(jié)的前后關(guān)系
stampingHandler.setNext(weldingHandler);
weldingHandler.setNext(paintingHandler);
paintingHandler.setNext(assemblyHandler);
//這個(gè)例子是從一開始的沖壓環(huán)節(jié)開始
stampingHandler.produceHandler("stamping");
System.out.println("-------------------------");
//這個(gè)例子我們從涂裝開始
stampingHandler.produceHandler("painting");
}
}
//下面的輸出的結(jié)果
//例子1:從沖壓開始
//我來處理沖壓任務(wù)
//我來處理焊接任務(wù)
//我來處理涂裝任務(wù)
//我來處理總裝任務(wù),全結(jié)束
//-------------------------
//例子2:從涂裝開始
//我來處理涂裝任務(wù)
//我來處理總裝任務(wù)酪呻,全結(jié)束
當(dāng)然了减宣,也可以簡單一點(diǎn),任務(wù)只有一個(gè)節(jié)點(diǎn)負(fù)責(zé)處理玩荠,你想想漆腌,該怎么來改呢,歡迎回復(fù)姨蟋!