單例模式應(yīng)該是大家印象最深的一種設(shè)計(jì)模式了。在Spring中最明顯的使用場(chǎng)景是在配置文件中配置注冊(cè)bean對(duì)象的時(shí)候設(shè)置scope的值為singleton 。
<bean class="com.bjpowernode.pojo.User" id="user" scope="singleton">
<property name="name" value="張三"></property>
</bean>
原型模式也叫克隆模式,Spring中該模式使用的很明顯,和單例一樣在bean標(biāo)簽中設(shè)置scope的屬性prototype即表示該bean以克隆的方式生成
<bean class="com.bjpowernode.pojo.User" id="user" scope="prototype">
<property name="name" value="張三"></property>
</bean>
模板模式的核心是父類(lèi)定義好流程,然后將流程中需要子類(lèi)實(shí)現(xiàn)的方法就抽象話留給子類(lèi)實(shí)現(xiàn),Spring中的JdbcTemplate就是這樣的實(shí)現(xiàn)。我們知道jdbc的步驟是固定
1)加載驅(qū)動(dòng),
2)獲取連接通道,
3)構(gòu)建sql語(yǔ)句.
4)執(zhí)行sql語(yǔ)句,
5)關(guān)閉資源
在這些步驟中第3步和第4步是不確定的,所以就留給客戶(hù)實(shí)現(xiàn),而我們實(shí)際使用JdbcTemplate的時(shí)候也確實(shí)是只需要構(gòu)建SQL就可以了.這就是典型的模板模式。我們以query方法為例來(lái)看下JdbcTemplate中的代碼.
觀察者模式定義的是對(duì)象間的一種一對(duì)多的依賴(lài)關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴(lài)于它的對(duì)象都得到通知并被自動(dòng)更新。使用比較場(chǎng)景是在監(jiān)聽(tīng)器中而spring中Observer模式常用的地方也是listener的實(shí)現(xiàn)。如ApplicationListener.
簡(jiǎn)單工廠模式:就是通過(guò)工廠根據(jù)傳遞進(jìn)來(lái)的參數(shù)決定產(chǎn)生哪個(gè)對(duì)象。Spring中我們通過(guò)getBean方法獲取對(duì)象的時(shí)候根據(jù)id或者name獲取就是簡(jiǎn)單工廠模式了。
<context:annotation-config/>
<bean class="com.bjpowernode.pojo.User" id="user" >
<property name="name" value="張三"></property>
</bean>
工廠方法模式:在Spring中我們一般是將Bean的實(shí)例化直接交給容器去管理的,實(shí)現(xiàn)了使用和創(chuàng)建的分離,這時(shí)容器直接管理對(duì)象,還有種情況是,bean的創(chuàng)建過(guò)程我們交給一個(gè)工廠去實(shí)現(xiàn),而Spring容器管理這個(gè)工廠。這個(gè)就是我們講的工廠模式,在Spring中有兩種實(shí)現(xiàn)一種是靜態(tài)工廠方法模式,一種是動(dòng)態(tài)工廠方法模式。以靜態(tài)工廠來(lái)演示
/**
* User 工廠類(lèi)
*
*/
public class UserFactory {
/**
* 必須是static方法
* @return
*/
public static UserBean getInstance(){
return new UserBean();
}
}
將一個(gè)類(lèi)的接口轉(zhuǎn)換成客戶(hù)希望的另外一個(gè)接口。使得原本由于接口不兼容而不能一起工作的那些類(lèi)可以在一起工作。這就是適配器模式。在Spring中在AOP實(shí)現(xiàn)中的Advice和interceptor之間的轉(zhuǎn)換就是通過(guò)適配器模式實(shí)現(xiàn)的。
class MethodBeforeAdviceAdapter implements AdvisorAdapter, Serializable {
@Override
public boolean supportsAdvice(Advice advice) {
return (advice instanceof MethodBeforeAdvice);
}
@Override
public MethodInterceptor getInterceptor(Advisor advisor) {
MethodBeforeAdvice advice = (MethodBeforeAdvice) advisor.getAdvice();
// 通知類(lèi)型匹配對(duì)應(yīng)的攔截器
return new MethodBeforeAdviceInterceptor(advice);
}
}
裝飾者模式:裝飾者模式又稱(chēng)為包裝模式(Wrapper),作用是用來(lái)動(dòng)態(tài)的為一個(gè)對(duì)象增加新的功能。裝飾模式是一種用于代替繼承的技術(shù),無(wú)須通過(guò)繼承增加子類(lèi)就能擴(kuò)展對(duì)象的新功能。使用對(duì)象的關(guān)聯(lián)關(guān)系代替繼承關(guān)系,更加靈活,同時(shí)避免類(lèi)型體系的快速膨脹。
spring中用到的包裝器模式在類(lèi)名上有兩種表現(xiàn):一種是類(lèi)名中含有Wrapper,另一種是類(lèi)名中含有Decorator。基本上都是動(dòng)態(tài)地給一個(gè)對(duì)象添加一些額外的職責(zé)。
具體的使用在Spring session框架中的SessionRepositoryRequestWrapper使用包裝模式對(duì)原生的request的功能進(jìn)行增強(qiáng),可以將session中的數(shù)據(jù)和分布式數(shù)據(jù)庫(kù)進(jìn)行同步,這樣即使當(dāng)前tomcat崩潰,session中的數(shù)據(jù)也不會(huì)丟失。
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session</artifactId>
<version>1.3.1.RELEASE</version>
</dependency>
代理模式:Spring的AOP功能用到了JDK的動(dòng)態(tài)代理和CGLIB字節(jié)碼生成技術(shù)
策略模式:例如Resource的實(shí)現(xiàn)類(lèi),針對(duì)不同的資源文件,實(shí)現(xiàn)了不同方式的資源獲取策略。
責(zé)任鏈模式:AOP中的攔截器鏈
委托者模式:DelegatingFilterProxy,整合Shiro,SpringSecurity的時(shí)候都有用到。
橋接模式:可以根據(jù)客戶(hù)的需求能夠動(dòng)態(tài)切換不同的數(shù)據(jù)源。比如我們的項(xiàng)目需要連接多個(gè)數(shù)據(jù)庫(kù),客戶(hù)在每次訪問(wèn)中根據(jù)需要會(huì)去訪問(wèn)不同的數(shù)據(jù)庫(kù)。