一、定義:屬于行為型設計模式,包含傳遞的數據、創建處理的抽象和實現、創建鏈條、將數據傳遞給頂端節點;
二、UML圖
三、實現
1、需要傳遞處理的數據類
import java.util.Date;/*** 需要處理的數據信息*/
public class RequestData {private Long id;private String message;private Date date;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public Date getDate() {return date;}public void setDate(Date date) {this.date = date;}@Overridepublic String toString() {return "RequestData{" +"id=" + id +", message='" + message + '\'' +", date=" + date +'}';}
}
2、抽象處理類(也可以是接口)
public abstract class AbstractRequestDataHandler { protected AbstractRequestDataHandler next; public AbstractRequestDataHandler getNext() { return next; } public void setNext(AbstractRequestDataHandler next) { this.next = next; } /** * 抽象的處理方法,傳入需要處理的數據類 * * @param data */ public abstract void handler(RequestData data); }
3、具體處理實現
public class RequestDataHandlerA extends AbstractRequestDataHandler {@Overridepublic void handler(RequestData data) {System.out.println("處理類A!");String message = data.getMessage().replace("A", "");data.setMessage(message);if (next != null) {next.handler(data);} else {System.out.println("終止執行");}}
}
public class RequestDataHandlerB extends AbstractRequestDataHandler {@Overridepublic void handler(RequestData data) {System.out.println("處理類B!");String message = data.getMessage().replace("B", "");data.setMessage(message);if (next != null) {next.handler(data);} else {System.out.println("終止執行");}}
}
public class RequestDataHandlerC extends AbstractRequestDataHandler {@Overridepublic void handler(RequestData data) {System.out.println("處理類C!");String message = data.getMessage().replace("C", "");data.setMessage(message);if (next != null) {next.handler(data);} else {System.out.println("終止執行");}}
}
4、客戶端
public class ChainResponsibilityClient {public static void main(String[] args) {AbstractRequestDataHandler handler1 = new RequestDataHandlerA();AbstractRequestDataHandler handler2 = new RequestDataHandlerB();AbstractRequestDataHandler handler3 = new RequestDataHandlerC();//生成調用鏈條handler1.setNext(handler2);handler2.setNext(handler3);//把數據交給handler1處理即可,不需要關心h2和h3怎么處理的RequestData requestData = new RequestData();requestData.setMessage("ABCDE");handler1.handler(requestData);System.out.println(requestData.getMessage());}
}
四、責任鏈模式需要注意的地方
1、循環調用,比如下列代碼會造成循環調用:
//生成調用鏈條handler1.setNext(handler2);handler2.setNext(handler3);handler3.setNext(handler1);
2、鏈條太長可能會導致的性能問題
3、責任鏈的頂端和低端節點之間不應該存在耦合問題