大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 hot資訊 Java的設計模式常見應用場景

Java的設計模式常見應用場景

更新時間:2021-04-26 11:37:25 來源:動力節點 瀏覽1095次

1.Java I/O中的設計模式

(1)適配器模式

適配器模式就是把一個類的接口變換成客戶端所能接受的另一種接口,從而使兩個接口不匹配而無法在一起工作的兩個類能夠在一起工作。通常被用在一個項目需要引用一些開源框架來一起工作時,這些框架的內部都有一些關于環境信息的接口,需要從外部引入,但是外部的接口不一定能匹配,在這種情況下,就需要適配器模式來轉換接口。

Java的I/O類庫中有許多這樣的需求,如將字符串轉成字節數據保存到文件中,將字節數據變成數據流等。具體來說,InputStreamReader和OutputStreamWriter就是適配器的體現。InputStreamReader實現了Reader接口,并且持有InputStream的引用,其作用是將InputStream適配到Reader。源角色就是InputStream代表的實例對象,目標角色就是Reader類。OutputStreamWriter也是類似的方式。

(2)裝飾器模式

裝飾器的作用是使得被裝飾者功能更強大,而且裝飾前后的使用方式不變。Java I/O類庫中有許多不同的功能組合情況,這些不同的功能組合都是使用裝飾器模式實現的。以FileInputStream為例,其類結構如下:

由于java I/O庫需要很多性能的各種組合,如果這些性能都是用繼承來實現,那么每一種組合都需要一個類,這樣就會造成大量行重復的類出現。如果采用裝飾模式,那么類的數目就會大大減少,性能的重復也可以減至最少。因此裝飾模式是java I/O庫基本模式。裝飾模式的引進,造成靈活性和復雜性的提高。因此在使用 java I/O 庫時,必須理解java I/O庫是由一些基本的原始流處理器和圍繞它們的裝飾流處理器所組成的。

InputStream類是以抽象組件的形式存在,而FileInputStream就是具體組件,它實現了抽象接口的所有方法,并且持有InputStream對象的引用。FileInputStream就是一個裝飾類,而BufferInputStream是這個裝飾類的具體實現者,它給InputStream加入了新的功能,使得InputStream讀取的數據保存在內存中,從而提高讀取性能。

(3)適配模式和裝飾模式的區別

適配模式是為了處理兩個借口不一致,改變現有接口使其匹配。

裝飾模式是在不改變現有接口的前提下,加入新的功能。

2.Javac中的訪問者模式

javac 是java語言編程編譯器。全稱javacompilation。javac工具讀由java語言編寫的類和接口的定義,并將它們編譯成字節代碼的class文件。javac 可以隱式編譯一些沒有在命令行中提及的源文件。用 -verbose 選項可跟蹤自動編譯。當編譯源文件時,編譯器常常需要它還沒有識別出的類型的有關信息。對于源文件中使用、擴展或實現的每個類或接口,編譯器都需要其類型信息。這包括在源文件中沒有明確提及、但通過繼承提供信息的類和接口。

Javac的編譯過程涉及許多語法分析,所有就有語法分析器、語義分析器和代碼生成器,期間需要多次遍歷語法樹。然而每次遍歷語法樹都會進行不同的處理動作,這是如何實現的呢?就是通過采用訪問者模式設計的,每次遍歷都是一次訪問者的執行過程。

訪問者模式可以使數據結構和對數據結構的操作解耦,使得增加對數據結構的操作不需要去修改數據結構,也不必去修改原有的操作,從而執行時再定義新的Visitor實現者就行了。在Javac中不同的編譯階段都定義了不同的訪問者模式實現。

3.Tomcat中的設計模式

(1)門面模式

Tomcat中門面設計模式使用得很多,因為Tomcat中有很多組件,每個組件要相互交互數據,用門面設計模式隔離數據是個很好的方法。

可以看到,HttpRequestFacade類封裝了HttpRequest接口,能夠提供數據,通過HttpRequestFacade訪問到的數據被代理到HttpReauest中、通常被封裝的對象都被設為Private或者Protectd的,防止在Facade中直接訪問。

(2)觀察者模式

Tomcat中觀察者模式也有多處使用,前面講的控制組件生命周期的Lifecycle就是這 種模式的體現,還有對Servlet實例的創建、Session的管理、Container等都是同樣的原理。 下面主要看一下Lifecycle的具體實現。

Lifecycle的觀察者模式結構圖如圖所示。

在上面的結構圖中,LifecycleListener代表的是抽象觀察者,它定義一個lifecycleEvent 方法,這個方法就是當主題變化時要執行的方法。ServerLifecycleListener代表的是具體的 觀察者,它實現了 LifecycleListener接口的方法,就是這個具體的觀察者具體的實現方式。 Lifecycle接口代表的是抽象主題,它定義了管理觀察者的方法和它所要做的其他方法。而 StandardServer代表的是具體主題,它實現了抽象主題的所有方法。這里Tomcat對觀察者 做了擴展,謂加了另外兩個類:LifecycleSupport和LifecycleEvent,它們作為輔助類擴展 了觀察者的功能。LifecycleEvent使得可以定義事件類別,不同的事件可區別處理,更加靈活。LifecycleSupport類代理了主題對多觀察者的管理,將這個管理抽出來統一實現,以 后如采修改只要修改LifecycleSupport類就可以了,不需要去修改所有的具體主題,因為 所有具體主題對觀察者的操作都被代理給LifecycleSupport類了。這可以認為是觀察者模式的改進版。

(3)命令設計模式
Tomcat中命令模式在Connector和Container組件之間有體現,Tomcat作為一個應用 服務器,無疑會接收到很多請求,如何分配和執行這些請求是必須的功能。
下面分析一下Tomcat是如何實現命令模式的,下圖是Tomcat命令模式的結構圖。

Connector作為抽象請求者,HttpConnector作為具體請求者。HttpProcessor作為命令。 Container作為命令的抽象接受者,ContainerBase作為具體的接受者。客戶端就是應用服務器Server組件了。Server首先創建命令請求者HttpConnector對象,然后創建命令 HttpProcessor對象。再把命令對象交給命令接受者ContainerBase容器來處理,命令最終是被Tomcat的Container執行的。命令可以以隊列的方式進來,Container也可以以不同的 方式來處理請求,如HTTP1.0協議和HTTP1.1的處理方式就不同。

(4)責任鏈模式

Tomcat 中一個最容易發現的設計模式就是責任鏈設計模式,這個設計模式也是 Tomcat 中 Containe設計的基礎,整個容器就是通過一個鏈連接在一起的,這個鏈一直將請求正確地傳遞給最終處理請求的那個 Servlet 。在Tomcat中這種設計模式兒乎被完整地使用,Tomcat的容器設置就是責任鏈模式,從Engine到Host再到Cortex,一直到Wrapper都通過這個鏈傳遞請求。

4.Spring中的設計模式

(1)簡單工廠模式

又叫做靜態工廠方法(StaticFactory Method)模式,但不屬于23種GOF設計模式之一。

簡單工廠模式的實質是由一個工廠類根據傳入的參數,動態決定應該創建哪一個產品類。

spring中的BeanFactory就是簡單工廠模式的體現,根據傳入一個唯一的標識來獲得bean對象,但是否是在傳入參數后創建還是傳入參數前創建這個要根據具體情況來定。如下配置,就是在 HelloItxxz 類中創建一個 itxxzBean。

<beans>
    <bean id="singletonBean" class="com.kang.HelloItxxz">
        <constructor-arg>
            <value>Hello! 這是singletonBean!value>
        </constructor-arg>
   </ bean>

    <bean id="itxxzBean" class="com.kang.HelloItxxz"
        singleton="false">
        <constructor-arg>
            <value>Hello! 這是itxxzBean! value>
        </constructor-arg>
    </bean>

</beans>

(2)工廠方法模式

通常由應用程序直接使用new創建新的對象,為了將對象的創建和使用相分離,采用工廠模式,即應用程序將對象的創建及初始化職責交給工廠對象。

一般情況下,應用程序有自己的工廠對象來創建bean.如果將應用程序自己的工廠對象交給Spring管理,那么Spring管理的就不是普通的bean,而是工廠Bean。

以工廠方法中的靜態方法為例講解一下:

import java.util.Random;
public class StaticFactoryBean {
      public static Integer createRandom() {
           return new Integer(new Random().nextInt());
       }
}

建一個config.xm配置文件,將其納入Spring容器來管理,需要通過factory-method指定靜態方法名稱,createRandom方法必須是static的,才能找到

<bean id="random"
class="example.chapter3.StaticFactoryBean" factory-method="createRandom" scope="prototype"
/>

(3)單例模式

保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。

spring中的單例模式完成了后半句話,即提供了全局的訪問點BeanFactory。但沒有從構造器級別去控制單例,這是因為spring管理的是是任意的java對象。 Spring下默認的bean均為singleton,可以通過singleton=“true|false” 或者 scope=“?”來指定

(4)代理模式

在Spring的Aop中,使用的Advice(通知)來增強被代理類的功能。Spring實現這一AOP功能的原理就使用代理模式(1、JDK動態代理。2、CGLib字節碼生成技術代理。)對類進行方法級別的切面增強,即,生成被代理類的代理類, 并在代理類的方法前,設置攔截器,通過執行攔截器重的內容增強了代理方法的功能,實現的面向切面編程。

(5)模板方法模式

定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。Template Method使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。

Template Method模式一般是需要繼承的。這里想要探討另一種對Template Method的理解。spring中的JdbcTemplate,在用這個類時并不想去繼承這個類,因為這個類的方法太多,但是我們還是想用到JdbcTemplate已有的穩定的、公用的數據庫連接,那么我們怎么辦呢?我們可以把變化的東西抽出來作為一個參數傳入JdbcTemplate的方法中。但是變化的東西是一段代碼,而且這段代碼會用到JdbcTemplate中的變量。怎么辦?那我們就用回調對象吧。在這個回調對象中定義一個操縱JdbcTemplate中變量的方法,我們去實現這個方法,就把變化的東西集中到這里了。然后我們再傳入這個回調對象到JdbcTemplate,從而完成了調用。這可能是Template Method不需要繼承的另一種實現方式吧。

(6)策略模式

Spring中的策略模式使用多如牛毛,所謂策略模式就是定義了算法族,分別封裝起來,讓他們之前可以互相轉換,此模式然該算法的變化獨立于使用算法的客戶。Spring的事務管理機制就是典型的策略模式,Spring事務策略是通過PlatformTransactionManager接口實現的,它是整個Spring事務的核心。它是對事務策略的一個高度抽象,不依賴于任何具體的事務策略,而對于底層的具體的事務策略它相應的有不同的實現類。而對于不同的事務策略的切換通常由Spring容器來負責管理,應用程序既無須與具體的事務API耦合,也無須與特定的實現類耦合而將應用和持久化技術,事務API徹底分離開來。

5.SpringMVC中的模板模式

所謂模板模式就是定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。SpringMVC在保證整個框架流程穩定的情況下,預留很多口子,而這些口子都是所謂的模板方法,可以自由指定,從而保證了靈活性,接下來的很多使用最佳實踐都是基于這種設計模式才可以實現。例如,下面的代碼中doResolveException(..)就是一個口子,子類方法doResolveException(..)可以定義具體如何處理異常。

public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
        Exception ex) {
    if (shouldApplyTo(request, handler)) {
        logException(ex, request);
        prepareResponse(ex, response);
        return doResolveException(request, response, handler, ex);
    } else {
        return null;
    }
}

protected abstract ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response,
        Object handler, Exception ex);

以上就是動力節點小編介紹的“Java的設計模式常見應用場景”的內容,希望對大家有幫助,如有疑問,請在線咨詢,有專業老師隨時為您服務。

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 成人青草亚洲国产 | 国产精品999在线 | 欧美洲大黑香蕉在线视频 | 国产精品一区二区国产 | 深夜网站在线观看 | 国产成人精品久久综合 | 国产成人91一区二区三区 | 奇米777影视 | 爱做久久久久久久久久 | 噜噜噜天天躁狠狠躁夜夜精品 | 欧洲性大片xxxxx久久久 | 色综合天天综合网国产成人网 | 亚洲天堂三级 | 国产精品欧美亚洲韩国日本 | 天天躁狠狠躁夜躁2021 | 一区二区三区视频 | 久久影视一区 | 99精品国产自产在线观看 | 一区二区在线精品免费视频 | 美日韩黄色大片 | 国产一级淫 | 久久久精品2018免费观看 | 日日摸夜夜摸无需播放器 | 高清波多野结衣一区二区三区 | 香蕉久久ac一区二区三区 | 女人大毛片一级毛片一 | 99视频在线国产 | 亚洲黄色激情视频 | 淫欲网| 久久久麻豆| 亚洲曰本大成网站mmm | 国产精品九九免费视频 | 欧美久色| 最新久久精品 | 8090成人午夜精品 | 亚洲狠狠婷婷综合久久久久 | 性欧美精品久久久久久久 | 麻豆精品成人免费国产片 | 亚洲黄色激情视频 | 欧美另类videos粗暴黑人 | 欧美一级毛片免费观看 |