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