《設(shè)計(jì)模式之策略模式與模板模式》由會員分享,可在線閱讀,更多相關(guān)《設(shè)計(jì)模式之策略模式與模板模式(45頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
1、單擊此處編輯母版標(biāo)題樣式,單擊此處編輯母版文本樣式,第二級,第三級,第四級,第五級,2016/11/13,#,設(shè)計(jì)模式之策略模式,主講人:成 玉 丹,時(shí) 間:,2016.11.14,目 錄,Contents,1,2,3,4,定義和角色,結(jié)構(gòu)示意圖,示例代碼,實(shí)例說明,5,優(yōu)缺點(diǎn)環(huán)境,定義:,策略模式定義了一系列的算法,并將每一個(gè)算法封裝起來,而且使它們還可以互相替換。策略模式讓算法獨(dú)立于使用它的客戶而獨(dú)立變化。,定義和角色,結(jié)構(gòu)示意圖,示例代碼,實(shí)例說明,優(yōu)缺點(diǎn)和環(huán)境,角色,(三種),:,策略接口,:,用來約束一系列具體的策略算法。,策略實(shí)現(xiàn),:,就是具體的算法實(shí)現(xiàn)。,上下文,:,負(fù)責(zé)和具體的
2、策略類交互,通常上下文會持有一個(gè)真正的策略實(shí)現(xiàn)。還可以讓具體的策略類來獲取上下文的數(shù)據(jù),甚至讓具體的策略類來獲取上下文的數(shù)據(jù)。,角色之間的關(guān)系:上下文使用策略接口來調(diào)用具體的策略實(shí)現(xiàn)定義的算法。,定義和角色,結(jié)構(gòu)示意圖,示例代碼,實(shí)例說明,優(yōu)缺點(diǎn)和環(huán)境,目 錄,Contents,1,2,3,4,定義和角色,結(jié)構(gòu)示意圖,示例代碼,實(shí)例說明,5,優(yōu)缺點(diǎn)和環(huán)境,策略實(shí)現(xiàn)(算法實(shí)現(xiàn)),定義和角色,結(jié)構(gòu)示意圖,示例代碼,實(shí)例說明,優(yōu)缺點(diǎn)和環(huán)境,目 錄,Contents,1,2,3,4,定義和角色,結(jié)構(gòu)示意圖,示例代碼,實(shí)例說明,5,優(yōu)缺點(diǎn)和環(huán)境,1,、,策略接口,:,定義算法的接口:,調(diào)用具體的算法,定
3、義和角色,結(jié)構(gòu)示意圖,示例代碼,實(shí)例說明,優(yōu)缺點(diǎn)和環(huán)境,2,、,策略實(shí)現(xiàn):在具體的算法實(shí)現(xiàn)中,定義了三個(gè),分別是,ConcreteStrategyA,、,ConcreteStrategyB,、,ConcreteStrategyC,,示例非常簡單,由于沒有具體算法的實(shí)現(xiàn),三者也就是名稱不同,示例代碼如下:,定義和角色,結(jié)構(gòu)示意圖,示例代碼,實(shí)例說明,優(yōu)缺點(diǎn)和環(huán)境,3,、,上下文的實(shí)現(xiàn):示例代碼如下,例如上文提到,A,B,C,三個(gè)對象,定義和角色,結(jié)構(gòu)示意圖,示例代碼,實(shí)例說明,優(yōu)缺點(diǎn)和環(huán)境,目 錄,Contents,1,2,3,4,定義和角色,結(jié)構(gòu)示意圖,示例代碼,實(shí)例說明,5,優(yōu)缺點(diǎn)和環(huán)境,實(shí)
4、例:,報(bào)價(jià)管理問題,向客戶報(bào)價(jià),對于銷售部門的人來講,這是一個(gè)非常重大、非常復(fù)雜的問題,對不同的客戶要報(bào)不同的價(jià)格,例如有新客戶、老客戶、大客戶等。,為了演示的簡潔性,假定現(xiàn)在需要實(shí)現(xiàn)一個(gè)簡化的報(bào)價(jià)管理,實(shí)現(xiàn)如下的功能:,1,)對普通客戶或者是新客戶報(bào)全價(jià),2,)對老客戶報(bào)的價(jià)格,統(tǒng)一折扣,5%,3,)對大客戶報(bào)的價(jià)格,統(tǒng)一折扣,10%,該怎么實(shí)現(xiàn)呢?,定義和角色,結(jié)構(gòu)示意圖,示例代碼,實(shí)例說明,優(yōu)缺點(diǎn)和環(huán)境,1,、,不用模式的解決方案:,這種解決方案存在的問題:,價(jià)格類包含了所有計(jì)算報(bào)價(jià)的算法,使得價(jià)格類,尤其是報(bào)價(jià)這個(gè)方法比較龐雜,難以維護(hù)。,定義了計(jì)算價(jià)格的算法,定義和角色,結(jié)構(gòu)示意圖,
5、示例代碼,實(shí)例說明,優(yōu)缺點(diǎn)和環(huán)境,2,、,不用模式的,修改,方案:,把這些算法從報(bào)價(jià)方法里面拿出去,形成獨(dú)立的方法,。,據(jù)此寫出如下的實(shí)現(xiàn)代碼,示例代碼如下:,把算法從報(bào)價(jià)方法里拿出去,形成獨(dú)立的方法,這里調(diào)用了算法,定義和角色,結(jié)構(gòu)示意圖,示例代碼,實(shí)例說明,優(yōu)缺點(diǎn)和環(huán)境,新客戶和普通客戶,老客戶,大客戶,這樣做的優(yōu)點(diǎn)是:容易擴(kuò)展,較好的維護(hù)。,缺點(diǎn)是:如果有,100,種情況時(shí),怎么做?,定義和角色,結(jié)構(gòu)示意圖,示例代碼,實(shí)例說明,優(yōu)缺點(diǎn)和環(huán)境,3,、策略,模式,下,的,解決,方案:,要使用策略模式來重寫前面報(bào)價(jià)的示例,大致有如下改變:,首先需要定義出算法的,接口,。,(策略接口),然后把各
6、種報(bào)價(jià)的計(jì)算方式單獨(dú)出來,形成,算法類,。,(策略實(shí)現(xiàn)),對于,Price,這個(gè)類,把它當(dāng)做,上下文,,在計(jì)算報(bào)價(jià)的時(shí)候,不再需,要判斷,直接使用持有的具體算法進(jìn)行運(yùn)算即可。選擇使用哪一個(gè)算法,的功能挪出去,放到外部使用的客戶端去。,(上下文),實(shí),例,的,結(jié),構(gòu),圖,定義和角色,結(jié)構(gòu)示意圖,示例代碼,實(shí)例說明,優(yōu)缺點(diǎn)和環(huán)境,先看策略接口,示例代碼如下:,定義和角色,結(jié)構(gòu)示意圖,示例代碼,實(shí)例說明,優(yōu)缺點(diǎn)和環(huán)境,接下來看看具體的算法實(shí)現(xiàn),不同的算法,,實(shí)現(xiàn)也不一樣,先看為新客戶或者是普通客戶計(jì)算應(yīng)報(bào)的價(jià)格的實(shí)現(xiàn),示例代碼如下:,定義和角色,結(jié)構(gòu)示意圖,示例代碼,實(shí)例說明,優(yōu)缺點(diǎn)和環(huán)境,老客戶計(jì)
7、算應(yīng)報(bào)的價(jià)格的實(shí)現(xiàn),示例代碼如下:,定義和角色,結(jié)構(gòu)示意圖,示例代碼,實(shí)例說明,優(yōu)缺點(diǎn)和環(huán)境,大客戶計(jì)算應(yīng)報(bào)的價(jià)格的實(shí)現(xiàn),示例代碼如下,:,定義和角色,結(jié)構(gòu)示意圖,示例代碼,實(shí)例說明,優(yōu)缺點(diǎn)和環(huán)境,接下來看看,上下文,的實(shí)現(xiàn),也就是原來的價(jià)格類,它的變化比較大,主要有:,原來那些私有的,用來做不同計(jì)算的方法,已經(jīng)去掉了,獨(dú)立出去做成了算法類,原來報(bào)價(jià)方法里面,對具體計(jì)算方式的判斷,去掉了,讓客戶端來完成選擇具體算法的功能,新添加持有一個(gè)具體的算法實(shí)現(xiàn),通過構(gòu)造方法傳入,原來報(bào)價(jià)方法的實(shí)現(xiàn),變化成了轉(zhuǎn)調(diào)具體算法來實(shí)現(xiàn),定義和角色,結(jié)構(gòu)示意圖,示例代碼,實(shí)例說明,優(yōu)缺點(diǎn)和環(huán)境,定義和角色,結(jié)構(gòu)示意
8、圖,示例代碼,實(shí)例說明,優(yōu)缺點(diǎn)和環(huán)境,寫個(gè)客戶端來測試運(yùn)行一下,示例代碼如下:,定義和角色,結(jié)構(gòu)示意圖,示例代碼,實(shí)例說明,優(yōu)缺點(diǎn)和環(huán)境,目 錄,Contents,1,2,3,4,定義和角色,結(jié)構(gòu)示意圖,示例代碼,實(shí)例說明,5,優(yōu)缺點(diǎn)和環(huán)境,優(yōu)點(diǎn):,1,、策略模式提供了管理相關(guān)的算法族的辦法。恰當(dāng)使用繼承可以把公共的代碼轉(zhuǎn)移到父類里面,從而避免重復(fù)的代碼。,2,、策略模式提供了可以替換繼承關(guān)系的辦法。繼承可以處理多種算法或行為。,3,、使用策略模式可以避免使用多重條件轉(zhuǎn)移語句。如果采用多重轉(zhuǎn)移語句將不易維護(hù),.,定義和角色,結(jié)構(gòu)示意圖,示例代碼,實(shí)例說明,優(yōu)缺點(diǎn)和環(huán)境,缺點(diǎn):,1,、客戶端必須
9、知道所有的策略類,并自行決定使用哪一個(gè)策略類。換言之,策略模式只適用于客戶端知道所有的算法或行為的情況。,2,、策略模式造成很多的策略類,每個(gè)具體策略類都會產(chǎn)生一個(gè)新類,使得策略類變得很復(fù)雜。,定義和角色,結(jié)構(gòu)示意圖,示例代碼,實(shí)例說明,優(yōu)缺點(diǎn)和環(huán)境,應(yīng)用環(huán)境:,1,、實(shí)現(xiàn)某特定功能在不同的情況下采用不同的策略即算法,程序在運(yùn)行時(shí)動態(tài)選擇所要采用的策略。,2,、對客戶端完全隱藏算法的具體實(shí)現(xiàn)細(xì)節(jié)。,3,、不同種算法之間可以彼此替換且完全獨(dú)立。,定義和角色,結(jié)構(gòu)示意圖,示例代碼,實(shí)例說明,優(yōu)缺點(diǎn)和環(huán)境,設(shè)計(jì)模式之模板方法模式,主講人:孫 晗,時(shí) 間:,2016.11.14,目 錄,Content
10、s,1,2,3,4,定義和角色,結(jié)構(gòu)示意圖,優(yōu)缺點(diǎn)和環(huán)境,實(shí)例說明,5,區(qū)別與聯(lián)系,定義:,一個(gè)抽象類中,有一個(gè)主方法,再定義,1,n,個(gè)方法,這些方法可以是抽象的,也可以是具體的;定義一個(gè)類,繼承該抽象類,重寫抽象方法,通過調(diào)用抽象類,實(shí)現(xiàn)對子類的調(diào)用,。,意圖:,模板方法模式是在一個(gè)方法中定義一個(gè)算法的骨架,而將一些步驟延遲到子類中實(shí)現(xiàn)。模板方法使得子類可以在不改變算法結(jié)構(gòu)的情況下,重新定義算法中的某些步驟,。,定義和角色,結(jié)構(gòu)示意圖,實(shí)例說明,區(qū)別與聯(lián)系,優(yōu)缺點(diǎn)和環(huán)境,角色,(兩種),:,抽象模板類:,定義了一個(gè)或多個(gè)抽象操作,以便讓子類實(shí)現(xiàn)。這些抽象操作叫做基本操作,它們是一個(gè)頂級邏輯
11、的組成步驟,定義并實(shí)現(xiàn)了一個(gè)模板方法,具體模板類:,現(xiàn)父類所定義的一個(gè)或多個(gè)抽象方法,每一個(gè)抽象模板類都可以有任意多個(gè)具體模板類與之對應(yīng),而每一個(gè)具體模板類都可以給出這些抽象方法的不同實(shí)現(xiàn),從而使得頂級邏輯的實(shí)現(xiàn)各不相同,定義和角色,結(jié)構(gòu)示意圖,實(shí)例說明,區(qū)別與聯(lián)系,優(yōu)缺點(diǎn)和環(huán)境,方法(兩種),:,模板方法,:,一個(gè)模板方法是定義在抽象類中的,把基本操作方法組合在一起形成一個(gè)總算法或一個(gè)總行為的方法。一個(gè)抽象類可以有任意多個(gè)模板方法,而不限于一個(gè)。每一個(gè)模板方法都可以調(diào)用任意多個(gè)具體方法。,基本方法,:,抽象方法:,由抽象類聲明,由具體子類實(shí)現(xiàn),,java,語言中以,abstract,關(guān)鍵字標(biāo)
12、出來。,具體方法:,由抽象類聲明并實(shí)現(xiàn),而子類并不實(shí)現(xiàn)或置換,,java,中沒有,abstract,關(guān)鍵字。,鉤子方法:,有抽象類聲明并實(shí)現(xiàn),而子類會加以擴(kuò)展。通常抽象類給出的實(shí)現(xiàn)是一個(gè)空實(shí)現(xiàn),作為方法的默認(rèn)實(shí)現(xiàn)。因此,此方法的存在,可以讓子類有能力對算法的不同點(diǎn)進(jìn)行掛鉤,要不要掛鉤,由子類自行決定。,定義和角色,結(jié)構(gòu)示意圖,實(shí)例說明,區(qū)別與聯(lián)系,優(yōu)缺點(diǎn)和環(huán)境,目 錄,Contents,1,2,3,4,定義和角色,結(jié)構(gòu)示意圖,優(yōu)缺點(diǎn)和環(huán)境,實(shí)例說明,5,區(qū)別與聯(lián)系,定義和角色,結(jié)構(gòu)示意圖,實(shí)例說明,區(qū)別與聯(lián)系,優(yōu)缺點(diǎn)和環(huán)境,目 錄,Contents,1,2,3,4,定義和角色,結(jié)構(gòu)示意圖,優(yōu)缺
13、點(diǎn)和環(huán)境,實(shí)例說明,5,區(qū)別與聯(lián)系,創(chuàng)建一個(gè)模板,(,抽象,),類:,Beverage(,飲料,),模板方法給出了邏輯的骨架,而邏輯的組成是一些相應(yīng)的抽象操作,他們推遲到子類中去實(shí)現(xiàn),定義和角色,結(jié)構(gòu)示意圖,實(shí)例說明,區(qū)別與聯(lián)系,優(yōu)缺點(diǎn)和環(huán)境,這就實(shí)現(xiàn)了模板方法中最重要的類的繼承和方法的復(fù)用,創(chuàng)建一個(gè)咖啡類,(,Coffee,),和茶,(,Tea,),類,都繼承,Beverage,抽象類,,而各個(gè)方法的具體實(shí)現(xiàn)方式都不同,定義和角色,結(jié)構(gòu)示意圖,實(shí)例說明,區(qū)別與聯(lián)系,優(yōu)缺點(diǎn)和環(huán)境,運(yùn)行結(jié)果,測試類,定義和角色,結(jié)構(gòu)示意圖,實(shí)例說明,區(qū)別與聯(lián)系,優(yōu)缺點(diǎn)和環(huán)境,目 錄,Contents,1,2,3
14、,4,定義和角色,結(jié)構(gòu)示意圖,優(yōu)缺點(diǎn)和環(huán)境,實(shí)例說明,5,區(qū)別與聯(lián)系,優(yōu)點(diǎn),(,1,)模板方法模式通過把不變的行為搬移到超類,去除了子類中的重復(fù)代碼。子類實(shí)現(xiàn)算法的某些細(xì)節(jié),有助于算法的擴(kuò)展和代碼復(fù)用。,(,2,)通過一個(gè)父類調(diào)用子類實(shí)現(xiàn)的操作,通過子類擴(kuò)展增加新的行為,符合“開放,-,封閉原則,”,。,(,3,)使用模板方法是系統(tǒng)擴(kuò)展性得到增強(qiáng),最小化了變化對系統(tǒng)的影響,。,定義和角色,結(jié)構(gòu)示意圖,實(shí)例說明,區(qū)別與聯(lián)系,優(yōu)缺點(diǎn)和環(huán)境,缺點(diǎn),(,1,)每個(gè)不同的實(shí)現(xiàn)都需要定義一個(gè)子類,這會導(dǎo)致類的個(gè)數(shù)的增加,也會增加很多具體方法的數(shù)量,使設(shè)計(jì)更加抽象。,(,2,)如果選用的實(shí)現(xiàn)方式不當(dāng),復(fù)用情
15、況會很差,。,定義和角色,結(jié)構(gòu)示意圖,實(shí)例說明,區(qū)別與聯(lián)系,優(yōu)缺點(diǎn)和環(huán)境,應(yīng)用范圍:,子類具有統(tǒng)一的操作步驟或操作過程,;,子類具有不同的操作細(xì)節(jié),;,存在多個(gè)具有同樣操作步驟的應(yīng)用場景,但某些具體的操作細(xì)節(jié)卻各不相同,。,定義和角色,結(jié)構(gòu)示意圖,實(shí)例說明,區(qū)別與聯(lián)系,優(yōu)缺點(diǎn)和環(huán)境,目 錄,Contents,1,2,3,4,定義和角色,結(jié)構(gòu)示意圖,優(yōu)缺點(diǎn)和環(huán)境,實(shí)例說明,5,區(qū)別與聯(lián)系,區(qū)別:,模板方法模式與策略模式的不同在于,策略模式使用委派的方法提供不同的算法行為,而模板方法模式使用繼承的方法提供不同的算法行為。與策略模式相比,模板方法模式的中心放在了方法調(diào)用的順序上,策略模式的中心集中在方法的封裝上。,聯(lián)系:,可以組合使用,模板方法重在封裝算法骨架,策略模式重在分離并封裝算法的實(shí)現(xiàn)。,定義和角色,結(jié)構(gòu)示意圖,實(shí)例說明,區(qū)別與聯(lián)系,優(yōu)缺點(diǎn)和環(huán)境,謝謝觀看,請老師和各位同學(xué)批評指正,!,