將各個功能拆分后分別封裝(各功能解耦),需要時可自由組合(包括執(zhí)行順序)
余杭網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)公司,余杭網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為余杭超過千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)營銷網(wǎng)站建設(shè)要多少錢,請找那個售后服務(wù)好的余杭做網(wǎng)站的公司定做!
話不多說,看個優(yōu)化案例吧。
以下是模擬客戶端想服務(wù)端發(fā)送請求的業(yè)務(wù)流程。
客戶端調(diào)用代碼如下。
// 客戶端
public class Client {
public static void main(String[] args) {
Map request = new HashMap<>();
request.put("username", "admin");
request.put("password", "admin");
service(request);
}
public static void service(Map request) {
String username = request.get("username");
String password = request.get("password");
if (!"admin".equals(username) || !"admin".equals(password)) {
throw new RuntimeException("用戶名或密碼不正確!");
}
System.out.println("用戶認(rèn)證通過。");
System.out.println("正在處理請求的業(yè)務(wù)。");
}
}
如果根據(jù)新的需求,需要在用戶認(rèn)證通過到處理請求的業(yè)務(wù)之間增加一個緩存用戶信息至Session的處理該怎么辦,傳統(tǒng)的寫法肯定是直接在上述代碼的第14行后加入一條緩存用戶信息的處理,但這樣下去,以后每次增加這部分的需求是都無一例外的需要修改客戶端的代碼,并且實際上客戶端發(fā)送請求的方法肯定不止一處,如果有一個新業(yè)務(wù)是需要在每個請求的方法中都添加呢。那又怎么辦?現(xiàn)在上面的代碼只是模擬,所以只需要加一行打印輸出即可,真實的邏輯可比這復(fù)雜得多,到時候的代碼量也是現(xiàn)在的好幾倍,豈不麻煩死了?
為了解決這個問題,我們可以使用責(zé)任鏈模式。
增加一組類,使用責(zé)任鏈模式。如下。
// 責(zé)任鏈的頂級接口
// 定義責(zé)任鏈的核心功能
public interface Chain {
// 指定下一個處理
void setNext(Chain next);
// 處理當(dāng)前請求
void handler(Map request);
}
// 責(zé)任鏈的抽象父類
// 定義所有責(zé)任鏈對象共通的屬性和方法
public abstract class AbstractChain implements Chain {
// 持有下一個處理
private Chain next;
public Chain getNext() {
return next;
}
@Override
public void setNext(Chain next) {
this.next = next;
}
}
// 用戶認(rèn)證模塊
public class AuthChain extends AbstractChain {
@Override
public void handler(Map request) {
String username = request.get("username");
String password = request.get("password");
if (!"admin".equals(username) || !"admin".equals(password)) {
throw new RuntimeException("用戶名或密碼不正確!");
}
System.out.println("用戶認(rèn)證通過。");
Chain next = this.getNext();
if (next == null) {
throw new RuntimeException("處理中斷!");
}
next.handler(request);
}
}
// Session緩存模塊
public class SessionChain extends AbstractChain {
@Override
public void handler(Map request) {
System.out.println("緩存用戶信息至Session。");
Chain next = this.getNext();
if (next == null) {
throw new RuntimeException("處理中斷!");
}
next.handler(request);
}
}
// 業(yè)務(wù)處理模塊
public class ProcessChain extends AbstractChain {
@Override
public void handler(Map request) {
System.out.println("正在處理請求的業(yè)務(wù)。");
}
}
修改后,客戶端代碼的調(diào)用如下。
public class Client {
public static void main(String[] args) {
Map request = new HashMap<>();
request.put("username", "admin");
request.put("password", "admin");
service(request);
}
public static void service(Map request) {
Chain auth = new AuthChain();
Chain session = new SessionChain();
Chain process = new ProcessChain();
auth.setNext(session);
session.setNext(process);
auth.handler(request);
}
}
熟悉數(shù)據(jù)結(jié)構(gòu)的同學(xué)肯定一眼就看出了責(zé)任鏈模式的本質(zhì):鏈表。將一個冗長的業(yè)務(wù)處理流程拆分成各個模塊,使用時根據(jù)業(yè)務(wù)流程以鏈表的形式將其串聯(lián)。不僅提升了各個模塊代碼的復(fù)用性,而且還能是的各個模塊自由組合,極大的提升了開發(fā)效率。