一篇了解責任鏈模式
本文轉載自微信公眾號「我好困啊」,作者mengxin。轉載本文請聯系我好困啊公眾號。
責任鏈模式:
定義一條加工鏈,請求發起者發起請求(原料),請求(原料)通過這條加工鏈進行一步步的處理后。輸出最終的產品產出。
意圖
請求的發起者和接收者,通過這條加工鏈條,進行解耦。將各種處理器進行連接,形成一條加工鏈條,請求一步步的進行傳遞,進行處理,直到處理完畢輸出。
主要解決
職責鏈上的處理者負責處理請求,請求發起者將請求發送到職責鏈上即可,無須關心請求的處理細節和請求的傳遞。
關鍵代碼
將各種職責處理器進行一步步連接,組裝成一條責任鏈。
優點
1.降低了耦合
2.簡化了對象,使得對象不需要知道責任鏈的具體實現
3.增強給對象指派職責的靈活性。如新增一個職責只需要加處理器加工到鏈上即可。
使用場景
有多個對象可以處理同一個請求。比如:定義了一個用戶對象,需要對這個用戶對象進行一系列處理。那么可以將各種處理抽象成處理器,將各種處理器進行連接形成一條加工鏈。將對象送入到加工鏈上進行處理。
示例圖:
具體實現
創建用戶類
- 1/**
- 2 * 用戶對象,對其進行加工
- 3 */
- 4@Data
- 5@AllArgsConstructor
- 6@NoArgsConstructor
- 7public class User {
- 8
- 9 private int id;
- 10
- 11 private String name;
- 12
- 13}
創建各種組裝器
- 1/**
- 2 * 組裝器(處理者)
- 3 */
- 4public interface Seter<T> {
- 5
- 6 //設置參數
- 7 void doSet(T request);
- 8}
ID組裝器
- 1/**
- 2 * ID 組裝器
- 3 */
- 4public class IdSeter implements Seter<User>{
- 5
- 6 @Override
- 7 public void doSet(User user) {
- 8 user.setId(1);
- 9 }
- 0}
name組裝器
- 1/**
- 2 *
- 3 * name 組裝器
- 4 */
- 5public class NameSeter implements Seter<User>{
- 6
- 7 @Override
- 8 public void doSet(User user) {
- 9 user.setName("mengxin");
- 0 }
接下來定義責任鏈,將組裝器連接起來
- 1/**
- 2 * 責任鏈模式(抽象責任鏈,可定義多種鏈)
- 3 */
- 4public interface Chain<T> {
- 5
- 6 //組裝
- 7 void assemble(T request);
- 8
- 9}
用戶責任鏈
- 1/**
- 2 * 用戶責任鏈
- 3 */
- 4public class UserChain implements Chain<User>{
- 5
- 6 private final List<Seter<User>> seters = new LinkedList<>();
- 7
- 8 //初始化(組裝責任鏈),注入seter處理器處理
- 9 public UserChain(){
- 10 //注入id設置器
- 11 seters.add(new IdSeter());
- 12 //注入名稱設置器
- 13 seters.add(new NameSeter());
- 14 }
- 15
- 16 /**
- 17 * 用戶責任鏈,調用seter,組裝參數
- 18 * @param request
- 19 */
- 20 @Override
- 21 public void assemble(User request) {
- 22 seters.forEach(userSeter -> userSeter.doSet(request));
- 23 }
- 24}
測試調用
- 1/**
- 2 * 責任鏈測試類
- 3 */
- 4public class Test {
- 5
- 6
- 7 public static void main(String[] args) {
- 8 //用戶責任鏈
- 9 UserChain userChain = new UserChain();
- 10 User user = new User();
- 11 //調用責任鏈,設置參數
- 12 userChain.assemble(user);
- 13 //加工完后獲取到的對象值
- 14 System.out.println(user.getId()+","+user.getName());
- 15 }
- 16}