版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
Javaweb
設(shè)計(jì)模式Javaweb設(shè)計(jì)模式22023/2/4目錄設(shè)計(jì)模式概述;設(shè)計(jì)模式的原則:
1、開閉原則2、單一職責(zé)原則
3、里氏代換原則4、接口隔離原則舉例創(chuàng)建型模式:
1、FactoryMethod(工廠方法)模式
2、Builder(建造者)模式
3、Prototype(原型)模式Javaweb設(shè)計(jì)模式32023/2/4設(shè)計(jì)模式概述
戰(zhàn)國·鄒·孟軻《孟子·離婁上》說:“離婁之明,公輸子之巧,不以規(guī)矩,不能成方圓?!边@就是說,做任何事都要有一定規(guī)則、規(guī)矩、做法,否則無法成功。因而一個設(shè)計(jì)模式就是一個已被記錄的最佳實(shí)踐或一個解決方案,這個最佳實(shí)踐或解決方案已被成功運(yùn)用在許多環(huán)境中,它解決了在某種特定環(huán)境中,重復(fù)發(fā)生的某個問題。為了解決軟件企業(yè)設(shè)計(jì)水平不高的問題,專家和富有經(jīng)驗(yàn)的設(shè)計(jì)者以設(shè)計(jì)模式的形式將他們的經(jīng)驗(yàn)傳授給我們,我們通過學(xué)習(xí),消化和吸收設(shè)計(jì)模式的精華。最終,既學(xué)會了好的設(shè)計(jì),也提升了軟件開發(fā)的質(zhì)量。雖然,軟件的設(shè)計(jì)模式是從歐美傳到中國,但是設(shè)計(jì)模式中的許多內(nèi)容都符合中國文化的思維模式,因此我們可以從學(xué)習(xí)模式發(fā)展到應(yīng)用模式,最終可以達(dá)到創(chuàng)造自己模式的境界。Javaweb設(shè)計(jì)模式42023/2/4設(shè)計(jì)模式原則1、設(shè)計(jì)原則之開閉原則:
開閉原則(OpenClosePrinciple,OCP)是指“軟件實(shí)體應(yīng)當(dāng)對擴(kuò)展開放,對修改關(guān)閉?!薄皩U(kuò)展是開放的”這意味著模塊的行為是可以擴(kuò)展的?!皩τ谛薷臅r封閉的”對模塊行為進(jìn)行為進(jìn)行擴(kuò)展時,不必改動模塊的源代碼或者二進(jìn)制代碼。我個人認(rèn)為開閉原則從軟件系統(tǒng)的角度來說:軟件系統(tǒng)中包含各種功能組件(例如菜單(menu)、模塊(Modules)、類(Class)以及功能(Functions)等等)應(yīng)該在不修改原有代碼的基礎(chǔ)上,添加新功能。同時對于經(jīng)常發(fā)生變化的有關(guān)值,可以進(jìn)行封裝。至于開閉原則中的“開”,可以認(rèn)為對于組件功能的擴(kuò)展是開放的,是允許對其進(jìn)行功能擴(kuò)展的。開閉原則中的“閉”,可以認(rèn)為對于原有代碼的修改時關(guān)閉的,即不需要改動原有代碼。
簡而言之,我們可以把開閉原則理解為—可以根據(jù)需求隨意增加新的類,但是不需要修改原有的類。
Javaweb設(shè)計(jì)模式52023/2/4
例如,一家公司人力資源部現(xiàn)有績效專員、培訓(xùn)發(fā)展專員和薪酬福利專員由于業(yè)務(wù)發(fā)展的需要,缺少一個人事助理。此時,人力資源部部門經(jīng)理通過招收一個新人任職“人事助理”便可滿足變化的需求,而不必變被動人力資源部的原有人員,如下圖所示:Javaweb設(shè)計(jì)模式62023/2/4為何要遵循開閉原則:
為什么要遵循開閉原則那?因?yàn)殚_閉原則是一切設(shè)計(jì)原則的基礎(chǔ),他是判斷面向?qū)ο笤O(shè)計(jì)是否正確的最基本原理之一。他在軟件可用性上,非常靈活。他可以通過不斷增加新的模塊來滿足不斷變化的需求!并且由于開閉原則規(guī)定對軟件原來的模塊不要修改,因此不用擔(dān)心軟件的穩(wěn)定性。如果一個軟件項(xiàng)目某些功能已不符合新的需求了,我們可以重新開發(fā),并且只需將現(xiàn)有的功能替換掉。比如說財(cái)政系統(tǒng)的算法發(fā)生了一些變化,我們可以在不改變原有代碼的情況下,重新實(shí)現(xiàn)一個新算法,將原有算法替換下來。比如說一個擁有“增加”,“刪除”,“查詢”功能模塊,現(xiàn)在要增加“修改”功能,此時,我們只需要新開發(fā)“修改”功能,而不需要改變原有模塊的功能??傊?,如果一個軟件系統(tǒng)遵循開閉原則去設(shè)計(jì),那么他至少具備以下好處:
1、可擴(kuò)展性高,非常靈活。無論是在軟件開發(fā)過程中,還是在軟件開發(fā)完成以后,我們都可以在軟件中進(jìn)行擴(kuò)展,加入新的功能。如此一來,軟件可以隨著不斷增加新模塊來滿足不斷變化的需求。
2、可維護(hù)性強(qiáng),無需修改原有代碼。因此,變化的軟件系統(tǒng)有一定的穩(wěn)定性可、和延續(xù)性。
Javaweb設(shè)計(jì)模式72023/2/4
實(shí)現(xiàn)開閉原則的核心之處在于“抽象”。由于軟件項(xiàng)目中,需求變更比價(jià)頻繁,這要求我們系統(tǒng)設(shè)計(jì)師在設(shè)計(jì)時,要區(qū)分那些事變化的部分,哪些是不變的部分。對于不變的部分,我們可以把這些不變的部分加以抽象成不變的接口。對于變化的部分,我們可以進(jìn)行評估和分類,每一個可變的因素都單獨(dú)進(jìn)行封裝。即便如此,由于需求的變化,設(shè)計(jì)時在設(shè)計(jì)階段要整理清楚所有的系統(tǒng)行為,這本是是不現(xiàn)實(shí)的。我們只能在某些組件,在某些程度上符合開閉原則的要求。至于開閉原則的具體抽象實(shí)現(xiàn)方面,可以通過Java的抽象類與接口去實(shí)現(xiàn)。以抽象類為例,對于一些具備形同功能的類進(jìn)行抽象處理,將公用部分的功能放入抽象類中,所有操作可以調(diào)用子類。這樣如果對系統(tǒng)進(jìn)行功能擴(kuò)展時,只需根據(jù)抽象類去實(shí)現(xiàn)新的子類。以接口為例,接口定義了子類需要實(shí)現(xiàn)的接口函數(shù)。這樣,如果要改換原有的實(shí)現(xiàn),只要改換一個實(shí)現(xiàn)類。如何實(shí)現(xiàn)開閉原則:Javaweb設(shè)計(jì)模式82023/2/4原則應(yīng)用舉例——出售鞋類某商店要開發(fā)商品應(yīng)用系統(tǒng),以方便管理。其中以出售鞋類為例,商店的鞋類分為男鞋和女鞋,需要進(jìn)行統(tǒng)一的折扣管理,如下圖:Javaweb設(shè)計(jì)模式92023/2/41、IShoe定義了三個數(shù)據(jù)屬性:鞋名、鞋類、價(jià)格
publicinterfaceIShoe{ publicStringgetName();//鞋名
publicStringgetType();//鞋類
publicintgetValue();//價(jià)格}2、MenShoe實(shí)現(xiàn)了接口IShoepublicclassMenShoeimplementsIShoe{ privateStringname;//男鞋名
privateStringtype;//男鞋類
privateintvalue;//男鞋價(jià)格
publicMenShoe(Stringname1,Stringtype1,intvalue1) { =name1;this.type=type1;this.value=value1; }Javaweb設(shè)計(jì)模式102023/2/4publicStringgetName(){ ; } publicStringgetType(){ returnthis.type; } publicintgetValue(){ returnthis.value; }}3、GirlShoe實(shí)現(xiàn)了接口IShoeJavaweb設(shè)計(jì)模式112023/2/4由于新店開張,為了提高人氣,擴(kuò)大商品知名度,店老本決定鞋進(jìn)行降價(jià)促銷:男鞋原價(jià)大于200元打8折,原價(jià)大于150元打8.5折,其他打9折。女鞋原價(jià)大于200元打7.5折,原價(jià)大于150元打8折,其他打8.5折。請看下面三個方案的比較:方案一:在接口IShoe中增加GetPriceCut()用于處理降價(jià),此時MenShoe和GirlShoe類也需要修改。此方式不符合開閉原則,并且改動量比較大。方案二:在MenShoe、GirlShoe中各增加一個方法,相對方案一要好一點(diǎn),但是還不是最好的方案。方案三:增加新的兩個類,如PriceCutMenShoe用于處理男鞋的降價(jià),PriceCutGilrShoe用于處理女鞋的降價(jià)。此方案修改量少可擴(kuò)展性強(qiáng),最符合開原則。Javaweb設(shè)計(jì)模式122023/2/4根據(jù)方案三的要求,原類圖變?yōu)椋篔avaweb設(shè)計(jì)模式132023/2/4(1)PriceCutMenShoe繼承MenShoe類,并擴(kuò)展了功能:Javaweb設(shè)計(jì)模式142023/2/4(2)PriceCutGirlShoe繼承GirlShoe類,并擴(kuò)展了功能:Javaweb設(shè)計(jì)模式152023/2/4開閉原則與StrutsStruts運(yùn)用MVC(Model-View-Controller,模型-視圖-控制器)技術(shù)處理各類任務(wù)和事件,其控制器由ActionServlet和Action構(gòu)成。
ActionServle采以J2EE核心控制器中的前端控制器模式為應(yīng)用系統(tǒng)提供了一個強(qiáng)有力的中心支撐點(diǎn),用于控制。這里,所謂的前端控制器,它主要負(fù)責(zé)的事情是處理全體用戶的相關(guān)請求,當(dāng)控制器對有關(guān)請求進(jìn)行校驗(yàn)與通過之后,可運(yùn)用重定向的方式才可訪問所需對象。
Action則主要用于業(yè)務(wù)模型的調(diào)用,并承擔(dān)客戶端請求與業(yè)務(wù)邏輯之間的交互控制。其業(yè)務(wù)的框架內(nèi)容細(xì)節(jié)有模型去打理。如此一來,此類清晰地分層結(jié)構(gòu)就能良好的實(shí)現(xiàn)開閉原則在軟件系統(tǒng)中的應(yīng)用。Javaweb設(shè)計(jì)模式162023/2/42、設(shè)計(jì)原則之單一職責(zé)原則:
單一職責(zé)原則(singleresponsibilityprinciole,SRP)是指,就一個類言應(yīng)該僅有一個引起它變化的原因。換言之,一個類,只需按職責(zé)進(jìn)行功能設(shè)計(jì)。此原則從軟件工程角度分析,符合“高內(nèi)聚低耦合”的標(biāo)準(zhǔn)。并且,我們在接口的設(shè)計(jì)方面也同樣單一職責(zé)的設(shè)計(jì)原則。為了更好的理解此原則,我們可以從以下兩點(diǎn)進(jìn)行分析:防止相同類型的職責(zé)分離到不同的類中。即我們需要提高代碼的重用性。同一個類無需編制多余的職責(zé)。即做事專一。
比如足球場上的裁判執(zhí)行競賽規(guī)則,主裁只能擔(dān)任主裁,助理裁判員只能擔(dān)任助理裁判員,而不能既擔(dān)任主裁又擔(dān)任助理裁判。下面我們分別來看一下違反SRP和符合SRP的設(shè)計(jì)是什么樣子的。(1)違反SRP的設(shè)計(jì):(2)符合SRP的設(shè)計(jì):
Javaweb設(shè)計(jì)模式172023/2/4
上圖中一個“裁判實(shí)現(xiàn)類”實(shí)現(xiàn)主裁接口和助理裁判接口并無不可。然而在下圖中則更符合單一職責(zé)原則,并且實(shí)際設(shè)計(jì)開發(fā)中比較常見。因此我推薦使用下面這種對應(yīng)的方法。Javaweb設(shè)計(jì)模式182023/2/4為何遵循單一職責(zé)
現(xiàn)階段,我國我國軟件行業(yè)的需求在不斷的變化。如果一個類或一個接口有超過一個以上的職責(zé),那么其中一個職責(zé)的變化將有可能導(dǎo)致其他職責(zé)的弱化。就像一個公司的老總,我們不能指望把他既當(dāng)管理人員又當(dāng)技術(shù)專家、業(yè)務(wù)專家、公關(guān)專家,我們必須對他的職責(zé)進(jìn)行明確。老總就是老總,只要他做好管理職責(zé),我們就認(rèn)為他是個好老總。明確職責(zé)后,通過運(yùn)用單一職責(zé)將帶來一些優(yōu)勢:
有助于清晰地理清設(shè)計(jì)與編碼的思路。有助于簡化維護(hù)、編碼、測試的流程。復(fù)雜問題簡單化,有利于代碼的重用。職責(zé)之間消除耦合之后,有利于系統(tǒng)的擴(kuò)展。Javaweb設(shè)計(jì)模式192023/2/4如何實(shí)現(xiàn)單一職責(zé)
如何合理的使用單一職責(zé)原則,是一個“仁者見仁,智者見智”的問題。為了科學(xué)的實(shí)現(xiàn)單一職責(zé),我們不妨從以下兩個角度進(jìn)行分析:(1)從面向?qū)ο蟮脑矸矫孢M(jìn)行分析。一個類通俗來講,它是按照對象的屬性和運(yùn)動規(guī)律的相似性,將相近的對象合并而成。那么這個類他只實(shí)現(xiàn)自身該做的事,即我們可以認(rèn)為他只是實(shí)現(xiàn)自己的職責(zé)。比如我們系統(tǒng)架構(gòu)設(shè)計(jì)人員,在架構(gòu)設(shè)計(jì)中經(jīng)常會用到分層的概念。其中沒個層次的類,各自實(shí)現(xiàn)各自的功能,這些功能可以理解為所謂的職責(zé)。
(2)從業(yè)務(wù)功能的角度進(jìn)行分析在我們應(yīng)用系統(tǒng)開發(fā)過程中,會涉及到各種各樣的功能模塊。比如常見的“增加”、“修改”、“刪除”、“查詢”功能,這些都屬于操作職責(zé),此時我們可以把它封裝成一個類。不過再設(shè)計(jì)類時需要考慮高內(nèi)聚、低耦合并且要注意類的大小范圍要適中。Javaweb設(shè)計(jì)模式202023/2/4
為何類的大要適中那?因?yàn)椋绻粋€類的范圍過小,那么“增加”、“刪除”、“查詢”、“修改”可以分成四個類,結(jié)果必然會導(dǎo)致接口過多,影響開發(fā)進(jìn)度;如果類的范圍過大,一個類可能包括多個功能職責(zé),結(jié)果必然會導(dǎo)致這個類維護(hù)復(fù)雜。Javaweb設(shè)計(jì)模式212023/2/4單一職責(zé)原則應(yīng)用-——產(chǎn)品報(bào)表
這個產(chǎn)品報(bào)表模塊的屬性包括生產(chǎn)年月、產(chǎn)品名稱、產(chǎn)品類型、品牌、產(chǎn)品價(jià)格和產(chǎn)地,具體功能只需實(shí)現(xiàn)查詢。方式一,把所有屬性功能封裝在一個接口中,利用實(shí)現(xiàn)類去實(shí)現(xiàn)接口,如下圖所示:Javaweb設(shè)計(jì)模式222023/2/4(1)IProductEntity既包含產(chǎn)品的各個屬性,又包含查詢功能。//單一職責(zé)原則應(yīng)用publicinterfaceIProductEntity{ publicStringgetYearMonth(StringYearMonth);//生產(chǎn)年月
publicStringgetName(StringName);//產(chǎn)品名稱
publicStringgetType(StringType);//產(chǎn)品類型
publicStringgetBrand(StringBrand);//品牌
publicintgetValue(intValue);//產(chǎn)品價(jià)格
publicStringgetLocality(StringLocality);//產(chǎn)地
/****************************************************/publicStringselectAll(Stringall);//查詢所有信息}Javaweb設(shè)計(jì)模式232023/2/4(2)ProductEntity類實(shí)現(xiàn)接口IProductEnityJavaweb設(shè)計(jì)模式242023/2/4(3)ProductService類實(shí)現(xiàn)接口IProductEnity??梢钥吹椒绞揭坏姆椒ㄟ`背了,單一職責(zé)原則。因?yàn)閱我宦氊?zé)告訴我們一個類只有一個引起該類變化的原因,這樣有利于提高可維護(hù)性和可恢復(fù)性。Javaweb設(shè)計(jì)模式252023/2/4
方式二,把產(chǎn)品屬性封裝在一個接口,產(chǎn)品業(yè)務(wù)操作功能封裝在另一個接口,如下圖所示:Javaweb設(shè)計(jì)模式262023/2/4(1)接口IProductEntity包含產(chǎn)品的各個屬性此時該接口中沒有定義查詢功能。Javaweb設(shè)計(jì)模式272023/2/4(2)新增IProductService接口包含產(chǎn)品的查詢功能publicinterfaceIProductService{publicStringselectAll(Stringall);//查詢所有信息}
這樣ProductEnity類和ProductService可以分別實(shí)現(xiàn)IProductEntity接口和IProductService接口。這樣實(shí)現(xiàn)了接口與實(shí)現(xiàn)類一一對應(yīng),符合單一職責(zé)原則,是一個較好的實(shí)現(xiàn)方式。Javaweb設(shè)計(jì)模式282023/2/43、設(shè)計(jì)原則之里氏代換原則:
里氏代換原則(LiskovSubstitutionPrinciple,LSP),它的完整表達(dá)是:“若對每個類型s的對象o1,都存在一個類型T的對象o2,使得在所有針對編寫的程序P中,用o1替換o2后,程序P行為功能不變,則S是T的子類型?!逼鋵?shí)從通俗的角度來講,我們可以這樣認(rèn)為,“如果對每一個類型為T1的對象o1,都有類型為T2的對象o2的存在,使得以T1定義的多有程序P在所有對象o1都替換成o2時程序P的行為也沒有變化,那么類型T2是類型T1de子類?!焙喍灾宇愋捅仨毮芴鎿Q掉他們的基類型。比如人類,分為男人和女人。他們各自繼承了人的特性,并且替換了人的一部分特性,因而形成男人與女人,如下圖:Javaweb設(shè)計(jì)模式292023/2/4
為了更好地理解此項(xiàng)原則,我們可以從以下幾點(diǎn)進(jìn)行分析:子類必須全部繼承基類的功能。比如汽車分為卡車、轎車、客車必須全部繼承汽車的功能,否則車子開不起來。允許子類進(jìn)行個性化設(shè)置,比如卡車、轎車、客車各自有其自身的特點(diǎn)。重寫或?qū)崿F(xiàn)積累的方法時輸入的參數(shù)可以自由設(shè)置,比如卡車載貨的大小等。子類中調(diào)用類,需要調(diào)用基類或接口。你如卡車、轎車、客車不調(diào)用其基類或接口則無法成為有用的車。Javaweb設(shè)計(jì)模式302023/2/4為何要實(shí)現(xiàn)里氏代換
目前,繼承是面向?qū)ο笏枷胫械囊粋€重要特點(diǎn)。它具有以下優(yōu)勢與問題:(1)優(yōu)勢他可以減少重復(fù)編碼,從而實(shí)現(xiàn)代碼的重用性。子類與基類,可以相似,也可以由各自的不同之處?;惪梢蕴岣叽a開放性。(2)問題當(dāng)父類的方法與屬性進(jìn)行變動時,其子類也要隨之修改。如果沒有一個科學(xué)的規(guī)范,則其結(jié)果會導(dǎo)致大量的代碼組要重構(gòu)?;诖耍捎诶锸洗鷵Q原則以繼承為基礎(chǔ),如果對其進(jìn)行合理的規(guī)范化,其結(jié)果可以大大的降低代碼的重構(gòu)。因此我們需要實(shí)現(xiàn)里氏代換。
Javaweb設(shè)計(jì)模式312023/2/4如何實(shí)現(xiàn)里氏代換
我們在涉及類的繼承時,可以從“父類不能替換子類,而子類可以替換父類”的思想引導(dǎo)下,進(jìn)行里氏代換原則實(shí)現(xiàn)。首先正確的進(jìn)行集成設(shè)計(jì)。所有基類的方法在其子類中得到實(shí)現(xiàn)或重寫,并且子類不能寫出與業(yè)務(wù)功能實(shí)現(xiàn)無關(guān)的多余的方法或?qū)崿F(xiàn)。其次,最優(yōu)的繼承層次設(shè)計(jì)。當(dāng)其它應(yīng)用類調(diào)用業(yè)務(wù)功能類時,應(yīng)該先調(diào)用業(yè)務(wù)功能的基類,而不應(yīng)該直接調(diào)用業(yè)務(wù)功能的子類對象。Javaweb設(shè)計(jì)模式322023/2/4里氏代換原則與Struts以及Spring里氏代換原則與StrutsStruts的ActionMessagesStruts具備消息傳遞功能,其核心如圖:Javaweb設(shè)計(jì)模式332023/2/4ActionMessage的容器包括ActionErrors和ActionMessages,后者的實(shí)例均可以相互設(shè)置為容器,并且ActionErrors也可運(yùn)用errors.add(msgs)使自己成為ActionMessages(父類實(shí)例)的容器。此處,較好的運(yùn)用了“里氏代換”原則的原理,即這種做法實(shí)現(xiàn)了在父類涉及的場所子類可安全的代替。Javaweb設(shè)計(jì)模式342023/2/42.里氏代換原則與Spring
依據(jù)里氏代換原則的原理展開分析,如果可以接收到父類的場所,能夠接收到子類。一貓為例,白貓與黑貓都需要睡覺與捕捉老鼠。(1)建立貓借口。
publicinterfaceCat{ publicvoidcatchMouse();//抓老鼠
publicvoidsieep();//睡覺
}(2)建立貓實(shí)現(xiàn)類(包括白貓和黑貓)Javaweb設(shè)計(jì)模式352023/2/4(3)創(chuàng)建bean映射配置文件,例如jackbean.xml(文件名隨意取),設(shè)置測試代碼。經(jīng)過getbean返回的對象(如WhiteCat或者BlackCat),均可賦予接口Cat;此時接口類調(diào)用其方法時,由于此時父類實(shí)際上接收了子類的對象因而此時調(diào)用了子類的方法,即Spring實(shí)現(xiàn)了“Catcat=newWhiteCate();”,當(dāng)然,子類通過Spring工廠映射配置生成而無需顯示。因此,spring實(shí)現(xiàn)了里氏代換原則,即接收父類的地方,也可接收子類。Javaweb設(shè)計(jì)模式362023/2/43、設(shè)計(jì)原則之接口隔離原則:
接口隔離原則簡稱ISP(InterfaceSegregationPrinciple)。它主要以下兩個定義:定義一:“不應(yīng)強(qiáng)迫客戶依賴于他們不用的方法。”定義二:“一個類對另一個類的依賴性應(yīng)當(dāng)是建立在最小的接口上。”細(xì)度以上兩個定義,我個人認(rèn)為他體現(xiàn)的意思基本一致。它們都是說定義接口的表達(dá)要準(zhǔn)確,不要創(chuàng)建多余的方法?;诖?,在現(xiàn)實(shí)生活中不難發(fā)現(xiàn)接口隔離的案例。比如,將我們的手機(jī)構(gòu)建成一個接口。如下圖所示:Javaweb設(shè)計(jì)模式372023/2/4
此時,我的手機(jī)與他的手機(jī)要調(diào)用手機(jī)接口,則會顯示接口的所有方法。但是我的手機(jī)與他的手機(jī)如果用處不同,則需要將接口重新規(guī)劃。比如,我的手機(jī)用于上網(wǎng)和玩游戲,他的手機(jī)用于發(fā)短信和通話,則需要規(guī)劃兩個接口,如下圖所示:Javaweb設(shè)計(jì)模式382023/2/4為何要實(shí)現(xiàn)接口隔離ISP理解起來很簡單,我們可以把接口理解成角色,但是在實(shí)際應(yīng)用開發(fā)中卻經(jīng)常有人違反此原則。比如以下兩點(diǎn):我們經(jīng)常會發(fā)現(xiàn)一個Java代碼中有一個大接口,里面放著一大堆方法,其中有些方法根本沒有作用。其必然會導(dǎo)致開發(fā)人員將不需要實(shí)現(xiàn)的方法多次放置在接口中,造成一定程度的代碼冗余。我們在系統(tǒng)開發(fā)時,如果一個職責(zé)改變了,那么我們就去修改這個接口?這個接口有多少個實(shí)現(xiàn)類,我們就要去修改多少個類。如果我們運(yùn)用接口隔離原則,一開始就設(shè)計(jì)角色獨(dú)立的接口,這種情況就不會出現(xiàn)了?;诖?,為了解決此類問題,實(shí)現(xiàn)接口的隔離原則是一個較好的方法。Javaweb設(shè)計(jì)模式392023/2/4如何實(shí)現(xiàn)接口隔離
如何實(shí)現(xiàn)接口隔離原則,是一個讓人深思的課題。我們不放從以下幾個方面去考慮:首先,從業(yè)務(wù)邏輯角度考慮接口,我們可以把某類功能也設(shè)計(jì)成接口。其次,根據(jù)場合和調(diào)用者的情況,消除無關(guān)的方法,只提供類型角色的接口。再次,我們對客戶程序進(jìn)行有效區(qū)分,并對其應(yīng)用的接口進(jìn)行變化。比如,當(dāng)客戶程序又亂又雜,此時我們需要對其進(jìn)行分離,隨著客戶程序的分離,對其應(yīng)用的接口也進(jìn)行分離。如此一來,分離的客戶程序與其接口則是同一角色對應(yīng)的接口隔離模式。Javaweb設(shè)計(jì)模式402023/2/4接口隔離規(guī)則應(yīng)用——商品管理功能設(shè)計(jì)某公司需要開發(fā)一個B2C網(wǎng)站,其中一個商品管理的功能如下:門戶網(wǎng)站,只需查詢方法;管理系統(tǒng)后臺,需要“增加、修改、查詢、刪除”功能。此時,設(shè)計(jì)師該如何運(yùn)用接口隔離原則比較合理那?如下圖:這種方式使接口與實(shí)現(xiàn)類角色一一對應(yīng),符合接口隔離原則。Javaweb設(shè)計(jì)模式412023/2/4(1)ICommodityForPortal包含商品查詢各個功能publicinterfaceICommodityForPortal{ publicStringGetCommodity(StringCommodity);//查詢
}(2)ICommodityForAdmin包含商品“增加”、“修改”、“刪除”的功能。publicinterfaceICommodityForAdmin{ publicStringGetCommodity(StringCommodity);//查詢
publicStringInsert(StringInsert);//method2插入
publicStringUpdate(StringUpdate);//method3修改
publicStringDelete(StringDelete);//method4刪除
}Javaweb設(shè)計(jì)模式422023/2/4Portal接口實(shí)現(xiàn)接口ICommodityForPortalAdmin實(shí)現(xiàn)接口ICommodityForAdminJavaweb設(shè)計(jì)模式432023/2/4接口隔離原則在Spring中的應(yīng)用
在Spring框架中org.springframework.beans.factory.BeanFactory是IoC容器的核心組成部分,大家在調(diào)用BeanFactory接口機(jī)主要相關(guān)接口時,就可以發(fā)現(xiàn)他們體現(xiàn)了接口隔離原則的相關(guān)原理。如下圖:BeanFactory提供管理多個對象的各個方法都很簡潔,繼承者只要使用他們所需要的內(nèi)容即可。ApplicationContext實(shí)現(xiàn)了BeanFactory的相關(guān)方法,并可將來自BeanFactory的功能進(jìn)行進(jìn)一步的提升。HierarchicalBeanFactory接口在實(shí)現(xiàn)BeanFactory的基礎(chǔ)上,將BeanFactory可以集成父容器的功能進(jìn)行了具體的落實(shí),并且可以方便其他程序有效地創(chuàng)建工廠鏈。ListableBeanFactory接口主要實(shí)現(xiàn)了BeanFactory中能夠列表的相關(guān)Bean,我們可以將他理解為Ioc容器的門之一。Javaweb設(shè)計(jì)模式442023/2/4舉例創(chuàng)建型模式FactoryMethod(工廠方法)模式
工廠方法模式又叫虛擬構(gòu)造(VirtualConstructor)模式或者多態(tài)工廠(PolymorphicFactory)模式。它的正式定義為:“工廠方法模式定義了一個創(chuàng)建對象的接口,但由子類決定要實(shí)例化的類時哪一個。工廠方法讓類把實(shí)例化推遲到子類?!?/p>
為了更好的理解此模式,我們可以從一個服裝廠生產(chǎn)產(chǎn)品的例子去分析。比如一個服裝廠由成人服裝廠和兒童服裝廠組成,其產(chǎn)品包括上裝、褲子和連衣裙,如下圖所示:Javaweb設(shè)計(jì)模式452023/2/4
根據(jù),目前業(yè)界公認(rèn)的看法。工廠方法模式結(jié)構(gòu),由“抽象工廠、具體工廠、抽象產(chǎn)品、具體產(chǎn)品”角色組成。抽象工廠是工廠方法的核心,它是與應(yīng)用程序無關(guān)的。任何在模式中創(chuàng)建對象的工廠類必須實(shí)現(xiàn)這個接口。在實(shí)際的系統(tǒng)中,這個角色也常常使用Java類實(shí)現(xiàn)。具體工廠是實(shí)現(xiàn)了抽象工廠接口的具體Java類。抽象產(chǎn)品是工廠方法模式所創(chuàng)建的對象的超類型,也就是產(chǎn)品對象的共同父類或共同擁有的接口。具體產(chǎn)品是實(shí)現(xiàn)了抽象產(chǎn)品角色所聲明的接口。上圖中,服裝廠是抽象工廠,成人服裝廠和兒童服裝廠是具體工廠,產(chǎn)品是抽象產(chǎn)品,上裝、褲子、連衣裙是具體產(chǎn)品。Javaweb設(shè)計(jì)模式462023/2/4工廠方法的應(yīng)用優(yōu)勢與時機(jī)工廠方法具備以下一些優(yōu)勢:在軟件開發(fā)過程中,工廠方法通過使用產(chǎn)品的接口去實(shí)現(xiàn)功能,并且其實(shí)現(xiàn)的任務(wù)可以延遲到子類中去完成。添加新產(chǎn)品無需修改接口。隔斷了客戶與具體產(chǎn)品的依賴關(guān)系,提高可產(chǎn)品的可擴(kuò)展性?;诖?,我認(rèn)為可以在以下幾種情形下采用工廠方法模式進(jìn)行軟件設(shè)計(jì)與實(shí)施:當(dāng)客戶程序不了解調(diào)用幾個類進(jìn)行實(shí)例化時,我們可以運(yùn)用工廠方法模式來創(chuàng)建一個接口,用于控制對一些類進(jìn)行實(shí)例化。當(dāng)“父類”考慮使用子類去指定創(chuàng)建的對象時。當(dāng)一個類不清楚它需要建立的對象時,可以通過其子類來實(shí)現(xiàn)。Javaweb設(shè)計(jì)模式472023/2/4應(yīng)用情形——評選先進(jìn)
在某工廠新來了一個技術(shù)工人。由于他既在生產(chǎn)上提出了創(chuàng)新的方法,又在工作上任勞任怨。因此,他被大家兩次評選為先進(jìn)個人。針對這一情況,本例運(yùn)用工廠方法模式進(jìn)行設(shè)計(jì),如下圖:Javaweb設(shè)計(jì)模式482023/2/4(1)機(jī)械廠publicinterfaceIMachineFactory{ IGongRenCreateGongRen();}
(2)機(jī)械廠表揚(yáng)1(3)機(jī)械廠表揚(yáng)2Javaweb設(shè)計(jì)模式492023/2/4(4)IGongRen接口(5)表揚(yáng)1(6)表揚(yáng)2與表揚(yáng)1基本相同,只是將類名換為PraiseTwo。Javaweb設(shè)計(jì)模式502023/2/4工廠方法模式與SpringSpring框架的FactoryBean接口,可以體現(xiàn)工廠方法的應(yīng)用,如下圖:FactoryBean是抽象工廠,ProxyFactoryBean、TimerFactoryBean是具體工廠Object是抽象產(chǎn)品,AopProxy、Timer是具體產(chǎn)品。Javaweb設(shè)計(jì)模式512023/2/42.Builder(建造者)模式
建造者模式是指“將一個復(fù)雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示?!贝挚雌饋泶蠹铱赡苡悬c(diǎn)迷惑不解。其實(shí)我們可以把它形象化。復(fù)雜的對象的構(gòu)建與它的表示分離,可以理為一輛汽車,無論使用何種品牌的部件,只要能正常安裝即可。使得同樣的構(gòu)建過程可以可以傳建不同的表示,可理解為同樣的部件可以采用多種安裝方式。為了進(jìn)一步理解建造者模式,我們通過模式的角色與實(shí)例進(jìn)行說明,建造者模式由以下四個角色構(gòu)成:Javaweb設(shè)計(jì)模式522023/2/4(1)Builder(抽象建造者角色)為創(chuàng)建一個Product對象的各個部件指定抽象接口。(2)ConcerteBuilder(具體建造者角色)實(shí)現(xiàn)Builder的接口以構(gòu)造和裝配該產(chǎn)品的各個部件。定義并且明確他所創(chuàng)建的表示。提供一個檢索產(chǎn)品的接口。(3)Director(導(dǎo)演者角色)構(gòu)造一個使用Builder接口的對象。(4)Product(產(chǎn)品角色)表示構(gòu)造的復(fù)雜對象。ConcreteBuilder創(chuàng)建該產(chǎn)品的內(nèi)部表示并定義它的裝配過程。包含定義成部件的類,包含將這些部件裝配成最終產(chǎn)品的接口。Javaw
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版電子商務(wù)客戶關(guān)系管理系統(tǒng)集成合同3篇
- 二零二五年環(huán)保設(shè)施工程設(shè)計(jì)合同補(bǔ)充協(xié)議3篇
- 二零二五版中藥材撫育承包合作合同3篇
- 二零二五年綠色環(huán)保外架爬架租賃與施工合同3篇
- 二零二五年教育資源共享與銷售合同樣本3篇
- 二零二五版房地產(chǎn)項(xiàng)目土地二級開發(fā)與銷售合同協(xié)議書3篇
- 二零二五版企業(yè)內(nèi)部股權(quán)交易及管理服務(wù)合同2篇
- 二零二五年酒店集團(tuán)年度客戶關(guān)系管理合作合同范本2篇
- 二零二五年船舶開荒保潔與設(shè)備維護(hù)合同范本3篇
- 二零二五版廢棄物處理廠環(huán)境監(jiān)測與治理服務(wù)合同3篇
- 建筑保溫隔熱構(gòu)造
- 智慧財(cái)務(wù)綜合實(shí)訓(xùn)
- 安徽省合肥市2021-2022學(xué)年七年級上學(xué)期期末數(shù)學(xué)試題(含答案)3
- 教育專家報(bào)告合集:年度得到:沈祖蕓全球教育報(bào)告(2023-2024)
- 肝臟腫瘤護(hù)理查房
- 護(hù)士工作壓力管理護(hù)理工作中的壓力應(yīng)對策略
- 2023年日語考試:大學(xué)日語六級真題模擬匯編(共479題)
- 皮帶拆除安全技術(shù)措施
- ISO9001(2015版)質(zhì)量體系標(biāo)準(zhǔn)講解
- 《培訓(xùn)資料緊固》課件
- 黑龍江省政府采購評標(biāo)專家考試題
評論
0/150
提交評論