Spring中如何使用設計模式

2021-09-24 18:02:55 字數 3773 閱讀 1950

關於設計模式,如果使用得當,將會使我們的**更加簡潔,並且更具擴充套件性。本文主要講解spring中如何使用策略模式,工廠方法模式以及builder模式。

關於策略模式的使用方式,在spring中其實比較簡單,從本質上講,策略模式就是乙個介面下有多個實現類,而每種實現類會處理某一種情況。我們以發獎勵為例進行講解,比如我們在**系統中,有多種獎勵方式可供選擇,比如積分,虛擬幣和現金等。在儲存時,我們必然會使用乙個類似於type的字段用於表徵這幾種發放獎勵的,那麼這裡我們就可以使用多型的方式進行獎勵的發放。比如我們抽象出乙個prizesender的介面,其宣告如下:

public inte***ce prizesender
該介面中主要有兩個方法:support()和sendprize(),其中support()方法主要用於判斷各個子類是否支援當前型別資料的處理,而sendprize()則主要是用於進行具體的業務處理的,比如這裡獎勵的發放。下面就是我們三種不同型別的獎勵發放的具體**:

// 積分發放

@component

public class pointsender implements prizesender

@override

public void sendprize(sendprizerequest request)

}

// 虛擬幣發放

@component

public class virtualcurrencysender implements prizesender

@override

public void sendprize(sendprizerequest request)

}

// 現金發放

@component

public class cashsender implements prizesender

@override

public void sendprize(sendprizerequest request)

}

這裡可以看到,在每種子型別中,我們只需要在support()方法中通過request的某個引數來控制當前request是否是當前例項能夠處理的型別,如果是,則外層的控制邏輯就會將request交給當前例項進行處理。關於這個類的設計,有幾個點需要注意:

上面我們講解了如何使用spring來宣告乙個策略模式,那麼如何為不同的業務邏輯來注入不同的bean呢,或者說外層的控制邏輯是什麼樣的,這裡我們就可以使用工廠方法模式了。所謂的工廠方法模式,就是定義乙個工廠方法,通過傳入的引數,返回某個例項,然後通過該例項來處理後續的業務邏輯。一般的,工廠方法的返回值型別是乙個介面型別,而選擇具體子類例項的邏輯則封裝到了工廠方法中了。通過這種方式,來將外層呼叫邏輯與具體的子類的獲取邏輯進行分離。如下圖展示了工廠方法模式的乙個示意圖:

可以看到,工廠方法將具體例項的選擇進行了封裝,而客戶端,也就是我們的呼叫方只需要呼叫工廠的具體方法獲取到具體的事例即可,而不需要管具體的例項實現是什麼。上面我們講解了spring中是如何使用策略模式宣告處理邏輯的,而沒有講如何選擇具體的策略,這裡我們就可以使用工廠方法模式。如下是我們宣告的乙個prizesende***ctory:

@component

public class prizesende***ctory

}throw new unsupportedoperationexception("unsupported request: " + request);

}}

這裡我們宣告乙個了乙個工廠方法getprizesender(),其入參就是sendprizerequest,而返回值是某個實現了prizesender介面的例項,可以看到,通過這種方式,我們將具體的選擇方式下移到了具體的子類中的,因為當前實現了prizesender的bean是否支援當前request的處理,是由具體的子類實現的。在該工廠方法中,我們也沒有任何與具體子類相關的邏輯,也就是說,該類實際上是可以動態檢測新加入的子類例項的。這主要是通過spring的自動注入來實現的,主要是因為我們這裡注入的是乙個list,也就是說,如果有新的prizesender的子類例項,只要其是spring所管理的,那麼都會被注入到這裡來。下面就是我們編寫的一段用於測試的**來模擬呼叫方的呼叫:

@service

@autowired

private prizesende***ctory prizesende***ctory;

public void mockedclient()

}

在客戶端**中,首先通過prizesende***ctory獲取乙個prizesender例項,然後通過其sendprize()方法發放具體的獎勵,通過這種方式,將具體的獎勵發放邏輯與客戶端呼叫進行了解耦。而且根據前面的講解,我們也知道,如果新增了一種獎勵方式,我們只需要宣告乙個新的實現了prizesender的bean即可,而不需要對現有**進行任何修改。

關於builder模式,我想使用過lombok的同學肯定會說builder模式非常的簡單,只需要在某個bean上使用@builder註解進行宣告即可,lombok可以自動幫我們將其宣告為乙個builder的bean。關於這種使用方式,本人不置可否,不過就我的理解,這裡主要有兩個點我們需要理解:

關於builder模式,我們可以以前面獎勵發放的sendprizerequest的構造為例進行講解。在構造request物件的時候,必然是通過前台傳如的某些引數來經過一定的處理,最後生成乙個request物件。那麼我們就可以使用builder模式來構建乙個sendprizerequest。這裡假設根據前台呼叫,我們能夠獲取到prizeid和userid,那麼我們就可以建立乙個如下的sendprizerequest:

public class sendprizerequest 

@component

@scope("prototype")

public static class builder

public builder userid(string userid)

public sendprizerequest build()

} public prizetypeenum getprizetype()

public int getamount()

public string getuserid()

}

這裡就是使用spring維護乙個builder模式的示例,具體的 維護方式就是在builder類上使用@component和@scope註解來標註該builder類,這樣我們就可以在builder類中注入我們所需要的例項來進行一定的業務處理了。關於該模式,這裡有幾點需要說明:

上面我們展示了如何使用spring的方式來宣告乙個builder模式的類,那麼我們該如何進行使用呢,如下是我們的乙個使用示例:

@service

@autowired

private prizesende***ctory prizesende***ctory;

@autowired

public void mockedclient()

public builder newprizesendrequestbuilder()

}

本文主要通過乙個獎勵發放的示例來對spring中如何使用工廠方法模式,策略模式和builder模式的方式進行講解,並且著重強調了實現各個模式時我們所需要注意的點。

Spring中如何使用設計模式

關於設計模式,如果使用得當,將會使我們的 更加簡潔,並且更具擴充套件性。本文主要講解spring中如何使用策略模式,工廠方法模式以及builder模式。關於策略模式的使用方式,在spring中其實比較簡單,從本質上講,策略模式就是乙個介面下有多個實現類,而每種實現類會處理某一種情況。我們以發獎勵為例...

Spring 中的設計模式

spring 的常用註解 required 該註解應用於設值方法 autowired 該註解應用於有值設值方法 非設值方法 構造方法和變數。qualifier 該註解和 autowired 搭配使用,用於消除特定 bean 自動裝配的歧義。簡單介紹一下 spring bean 的生命週期 bean ...

Spring中的設計模式

1.簡單工廠 實現方式 beanfactory。2.工廠方法 實現方式 factorybean介面。3.單例模式 實現方式 bean預設單例。getsingleton方法使用synchronized 雙重判空 4.介面卡模式 實現方式 springmvc中的介面卡handleradatper。5.模...