一篇了解責(zé)任鏈模式
本文轉(zhuǎn)載自微信公眾號(hào)「我好困啊」,作者mengxin。轉(zhuǎn)載本文請(qǐng)聯(lián)系我好困啊公眾號(hào)。
責(zé)任鏈模式:
定義一條加工鏈,請(qǐng)求發(fā)起者發(fā)起請(qǐng)求(原料),請(qǐng)求(原料)通過這條加工鏈進(jìn)行一步步的處理后。輸出最終的產(chǎn)品產(chǎn)出。
意圖
請(qǐng)求的發(fā)起者和接收者,通過這條加工鏈條,進(jìn)行解耦。將各種處理器進(jìn)行連接,形成一條加工鏈條,請(qǐng)求一步步的進(jìn)行傳遞,進(jìn)行處理,直到處理完畢輸出。
主要解決
職責(zé)鏈上的處理者負(fù)責(zé)處理請(qǐng)求,請(qǐng)求發(fā)起者將請(qǐng)求發(fā)送到職責(zé)鏈上即可,無須關(guān)心請(qǐng)求的處理細(xì)節(jié)和請(qǐng)求的傳遞。
關(guān)鍵代碼
將各種職責(zé)處理器進(jìn)行一步步連接,組裝成一條責(zé)任鏈。
優(yōu)點(diǎn)
1.降低了耦合
2.簡(jiǎn)化了對(duì)象,使得對(duì)象不需要知道責(zé)任鏈的具體實(shí)現(xiàn)
3.增強(qiáng)給對(duì)象指派職責(zé)的靈活性。如新增一個(gè)職責(zé)只需要加處理器加工到鏈上即可。
使用場(chǎng)景
有多個(gè)對(duì)象可以處理同一個(gè)請(qǐng)求。比如:定義了一個(gè)用戶對(duì)象,需要對(duì)這個(gè)用戶對(duì)象進(jìn)行一系列處理。那么可以將各種處理抽象成處理器,將各種處理器進(jìn)行連接形成一條加工鏈。將對(duì)象送入到加工鏈上進(jìn)行處理。
示例圖:
具體實(shí)現(xiàn)
創(chuàng)建用戶類
- 1/**
- 2 * 用戶對(duì)象,對(duì)其進(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}
測(cè)試調(diào)用
- 1/**
- 2 * 責(zé)任鏈測(cè)試類
- 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 //加工完后獲取到的對(duì)象值
- 14 System.out.println(user.getId()+","+user.getName());
- 15 }
- 16}