設(shè)計模式

創(chuàng)建模式

單例模式

什么是設(shè)計模式

  1. 設(shè)計模式:一套被反復使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計經(jīng)驗的總結(jié)耙旦。
  2. 目的:可重用代碼,讓代碼更容易被他人理解悬荣、保證代碼可靠性骑冗。
  3. Java中的設(shè)計模式:23種:
  • [x] 創(chuàng)建型模式:工廠方法模式、抽象工廠模式隆豹、單例模式椭岩、建造者模式、原型模式璃赡;
  • [x] 結(jié)構(gòu)型模式:適配器模式判哥、裝飾器模式、代理模式碉考、外觀模式塌计、橋接模式、組合模式侯谁、享元模式锌仅;
  • [x] 行為型模式:策略模式、模板方法模式墙贱、觀察者模式热芹、迭代子模式、責任鏈模式惨撇、命令模式伊脓、備忘錄模式、狀態(tài)模式魁衙、訪問者模式报腔、中介者模式、解釋器模式纺棺;
  • [x] 其它模式:并發(fā)型模式和線程池模式榄笙。
    單例模式:保證整個應用中某個實例有且只有一個。
    舉例:配置文件祷蝌、工具類、線程池、緩存米丘、日志對象等

單利模式實現(xiàn)

  1. 應用場合: 有些對象只需要一個就足夠了.
  2. 作用: 保證整個應用程序中某個實例有且只有一個.

(1) 餓漢式
懶漢模式剑令,先只是進行聲明,當存在該實例的時候直接返回拄查,不存在的時候再去新建

/*
 * 單例模式Singleton
 * 應用場合:有些對象只需要一個就足夠了吁津,如古代皇帝、老婆
 * 作用:保證整個應用程序中某個實例有且只有一個
 * 類型:餓漢模式堕扶、懶漢模式
 */
public class Singleton {
    //1.將構(gòu)造方法私有化典尾,不允許外部直接創(chuàng)建對象
    private Singleton(){
    }
    //2.創(chuàng)建類的唯一實例,使用private static修飾
    private static Singleton instance=new Singleton();
    //3.提供一個用于獲取實例的方法弃酌,使用public static修飾
    public static Singleton getInstance(){
        return instance;
    }
}

(2) 懶漢式
餓漢模式特點之一就是在類加載是這個類的實例就被加載了楣责,無論之后是否用到這個實例

/*
 * 懶漢模式
 */
public class Singleton2 {
    //1.將構(gòu)造方法私有化屯烦,不允許外邊直接創(chuàng)建對象
    private Singleton2(){

    }
    //2.聲明類的唯一實例,使用private static修飾
    private static Singleton2 instance;
    //3.提供一個用于獲取實例的方法懈词,使用public static修飾
    public static Singleton2 getInstance(){
        if(instance == null){
            instance = new Singleton2();
        }
        return instance;
    }

}

餓漢式、懶漢式區(qū)別

餓漢模式:在加載類的時候就加載了實例荧嵌,因此加載慢愉择,但運行快破花,線程安全
懶漢模式:在加載類時沒有加載實例嫡纠,加載快延赌,運行時加載實例除盏,運行慢,線程不安全

工廠模式

工廠模式的概念挫以、意圖者蠕、應用場景、動機

  1. 工廠模式的概念


  2. 工廠模式的意圖


  3. 工廠模式的應用場景


  4. 工廠模式的動機


  5. 工廠模式類圖


  6. 抽象工廠模式類圖


工廠模式的應用

  1. 常見的應用
    (1) JDBC的工作流程



    (2) spring beanfactory


  1. 對比:


  2. 實現(xiàn)了


  3. 適用場景


結(jié)構(gòu)型模式

代理模式

1. 概念

  • [x] 為其他對象提供一種代理掐松,以控制對這個對象的訪問(例如火車站代售處)踱侣。代理對象起到中介作用,可去掉功能服務或增加額外的服務大磺。

2. 代理模式的分類:

  • [ ] 遠程代理模式: 為不同地理的對象提供局域網(wǎng)代表對象(例子:通過遠程代理可以監(jiān)控各個店鋪抡句,使之可以直觀的了解店里的情況)
  • [ ] 虛擬代理: 根據(jù)需要將資源消耗很大的對象進行延遲,真正需要的時候進行創(chuàng)建
  • [ ] 保護代理: 控制用戶的訪問權(quán)限
  • [ ] 智能引用代理: 提供對目標對象提供額外的服務(火車票代售處)
智能引用代理:
靜態(tài)代理
  1. 靜態(tài)代理:代理和被代理對象在【代理之前】都是【確定】的杠愧。他們都實現(xiàn)【相同的接口或者繼承相同的抽象類】
  2. 代理實現(xiàn)方法:
    (1)繼承法:代理類直接【繼承】被代理類待榔,實現(xiàn)其原有方法,并添加一些額外功能
    (2)聚合方法:代理類實現(xiàn)【相同的功能接口:很重要流济,事項相同接口锐锣,不同代理也可以進行相互代理】盔几,并在內(nèi)聲明一個被代理類的對象(類似封裝)光督,通過內(nèi)部對象實現(xiàn)其原有方法,并添加額外功能

3身笤、靜態(tài)代理的實現(xiàn)
(1)聚合代理優(yōu)于繼承代理糖声。因為實現(xiàn)功能疊加的情況下橘茉,聚合代理通過相互代理可以實現(xiàn)功能重用,而繼承代理必須寫多個類來實現(xiàn)多功能疊加姨丈。
(2)靜態(tài)代理只能代理一種類型的被代理類,換個類型的就不行了擅腰,這需要動態(tài)代理

4蟋恬、靜態(tài)代理的兩種實現(xiàn)方式對比(繼承方式和聚合方式)
案例--代理類功能的疊加
(1) 繼承的方式:如果使用繼承的方式來實現(xiàn)我們代理功能的疊加,我們的代理類會無限的膨脹下去趁冈。
(2) 聚合的方式:由于代理類和被代理類都實現(xiàn)了相同的接口歼争,那么代理類的構(gòu)造參數(shù)就可以傳入該相同的接口拜马,這樣在后面功能疊加的時候就可以傳入其他功能的代理類,因為他們都實現(xiàn)了相同的父接口沐绒。從而達到功能疊加的作用俩莽。

動態(tài)代理
  1. JDK動態(tài)代理
    (1) 目的:動態(tài)產(chǎn)生代理,實現(xiàn)對【不同類】乔遮,【不同方法】的代理
    (2) java動態(tài)代理類扮超,位于java.lang.reflect包下,一般涉及兩個類:

(1)Interface InvocationHandler:該接口中僅定義了一個方法public object invoke(Object obj,Method method,Object[] args)
參數(shù):
obj:被代理類的對象
method:被代理的方法
args:被代理方法參數(shù)數(shù)組
返回值:
Object:方法返回值

(2)Proxy:該類即為動態(tài)代理類:
static Object newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h)
參數(shù):
loader:被代理類的類加載器蹋肮,通過被代理類.getClass().getClassLoader()得到
interfaces:實現(xiàn)的接口出刷,通過getClass().getInterfaces()得到
h:invocationHandler
返回值:
返回代理類的一個實例

  1. 動態(tài)代理實現(xiàn)步驟:
    (1)創(chuàng)建一個實現(xiàn)接口InvocationHandler的類,它必須實現(xiàn)invoke方法坯辩。
    (2)創(chuàng)建被代理的類以及接口馁龟。
    (3)調(diào)用Proxy的靜態(tài)方法,創(chuàng)建一個代理類漆魔。
    newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h)
    (4)通過代理調(diào)用方法坷檩。
CGLIB動態(tài)代理
  1. JDK動態(tài)代理與CGLIB動態(tài)代理之間的區(qū)別


  2. CGLIB:是一個強大的開源項目,可以在運行期擴展Java類與實現(xiàn)Java接口
  3. JDK動態(tài)代理實現(xiàn)思路
    實現(xiàn)功能:通過Proxy的newProxyInstance返回代理對象
    (1)聲明一段源碼(動態(tài)產(chǎn)生代理)
    (2)編譯源碼(JDK Compiler API)改抡,產(chǎn)生新的類(代理類)
    (3)將這個類load到內(nèi)存當中矢炼,產(chǎn)生一個新的對象(代理對象)
    (4)return 代理對象

3. 總結(jié)

1、代理概念雀摘、分類及應用場景
為其他對象設(shè)置總代理裸删,以控制對這個對象的訪問;
代理對象起到了中介的作用阵赠,去掉了某些功能涯塔,或增加了些額外的服務。
四類:
Remote Proxy -- 客戶端服務器的模式
Virtual Proxy -- 資源消耗很大清蚀,或復雜的對象匕荸,需要延遲,需要時創(chuàng)建枷邪,
Protect Proxy -- 保護和控制權(quán)限
Smart Reference Proxy -- 提供額外服務榛搔。

為什么只講智能引用代理?
使用得多:日志處理东揣、權(quán)限管理践惑、事務處理...
靜態(tài)代理(繼承嘶卧、聚合)
JDK動態(tài)代理實現(xiàn)日志處理的功能
模擬JDK動態(tài)代理實現(xiàn):在代理類Proxy和被代理類RealSubject之間,加入了invocationHandler侦铜。
調(diào)用jar包中某個類的方法,不能改源碼钉稍,AOP面向切面,增加額外事務邏輯种樱。

適配器模式

適配器模式定義:

將一個類的接口羞秤,轉(zhuǎn)換成期望的另外一個借口,使得由于接口不兼容而不能一起工作的那些類可以一起工作瘾蛋。

適配器模式: 構(gòu)成

構(gòu)成:客戶端俐镐、目標接口、原本接口哺哼、具體請求


適配器模式分類

  1. 組合
  1. 繼承


比較

作用

行為型模式

觀察者模式

1. 認識觀察者模式

(1)定義:
定義對象件的一種一對多的依賴關(guān)系佩抹,當一個對象的狀態(tài)發(fā)生改變時,所有依賴它的對象都會得到通知并且自動更新取董,
(2)流程圖:


2. 實現(xiàn)的兩種方式:推模型和拉模型

  1. 結(jié)構(gòu)
  1. 觀察者模式通用代碼
    步驟:
    (1)目標對象的定義
    (2)具體的目標對象的定義
    (3)觀察者接口的定義
    (4)觀察者的具體實現(xiàn)

3. 利用Java提供的觀察者實現(xiàn)

1. 認識觀察者模式

(1)目標與觀察者之間的關(guān)系:一對一棍苹、一對多、多對一等茵汰。
(2)單向依賴:觀察者依賴目標枢里,而不是目標依賴觀察者,觀察者是被動的蹂午,目標是主動的栏豺。
(3)命名建議:
1、目標接口的定義豆胸,建議在名稱后面跟Subject奥洼;
2、觀察者接口的定義晚胡,建議在名稱后面跟Observer灵奖;
3估盘、觀察者接口的更新方法遣妥,建議名稱為update沙咏,參數(shù)的個數(shù)及類型不受限制肢藐。
(4)觸發(fā)通知的時機:目標對象的狀態(tài)發(fā)生維護之后觸發(fā)吆豹。(比如:先賦值內(nèi)容再通知是對的痘煤,而反過來就會出現(xiàn)問題)
(5)觀察者模式調(diào)用時序:見觀察者模式調(diào)用時序圖I、II蘸拔。
(6)通知的順序:不確定调窍,平行的邓萨,沒有相互依賴關(guān)系缔恳。

  1. 準備階段


  2. 運行階段


2. 實現(xiàn)的兩種方式:推模型和拉模型

觀察者模式兩種模式:

  1. 推模型:目標對象主動向觀察者推送目標的詳細信息 ; 推送的信息通常是目標信息的全部或部分信息铃芦。


  2. 拉模型:目標對象在通知觀察者的時候,只傳遞少量信息 咧虎;如果觀察者需要更具體的信息砰诵,由觀察者主動到目標對象中獲取茁彭,相當于是觀察者從目標對象中拉數(shù)據(jù)理肺;一般這種模型的實現(xiàn)中年枕,會把目標對象自身通過update方法傳遞給觀察者熏兄。



    兩種模型的比較:

推模型是假定目標對象知道觀察著需要的數(shù)據(jù)霍弹。
拉模型是目標對象不知道觀察著具體需要什么數(shù)據(jù),因此把自身傳給觀察者耍缴,由觀察者來取值防嗡。
推模型會使觀察者對象難于復用实胸。
拉模型下钢属,update方法的參數(shù)是目標對象本身淆党,基本上可以適應于各種情況的需要山孔。

Java 實現(xiàn) VS 自己實現(xiàn)的對比四點:
(1)不需要再定義觀察者和目標接口(JDK已經(jīng)定義)饱须。
(2)具體的目標實現(xiàn)里面不需要再維護觀察者的注冊信息,Java中的Observable類里面已經(jīng)實現(xiàn)锅铅。
(3)觸發(fā)通知的方式有一點變化盐须,要先調(diào)用setChanged方法贼邓,這個是Java為了幫助實現(xiàn)更精確的觸發(fā)控制而提供的功能塑径。
(4)具體觀察者的實現(xiàn)里面,update方法其實能同時支持推模型和拉模型劳景,這個Java在定義的時候闷串,已經(jīng)考慮烹吵。

4. 簡述觀察者優(yōu)缺點

優(yōu)點: 缺點點:
1. 觀察者模式實現(xiàn)了觀察者和目標之間的抽象耦合 2. 觀察者模式實現(xiàn)了動態(tài)聯(lián)動 3. 觀察者模式支持廣播通信 可能會引起無謂的操作年叮。

5. 何時使用觀察者模式

使用觀察者模式的場景 --- 觸發(fā)聯(lián)動(本質(zhì))
1、當一個抽象模型有兩個方面跃惫,其中一個方面的操作依賴于另一個方面的狀態(tài)變化
2爆存、如果更改一個對象的時候携冤,需要同時連帶改變其他的對象曾棕,而且不知道究竟應該有多少對象需要被連帶改變
3翘地、當一個對象必須通知其他的對象,但是你又希望這個對象和其他被通知的對象是松散耦合的

6. 觀察者模式的衍生

觀察者模式——區(qū)別對待觀察者場景問題
  1. 需求總結(jié)
  1. 解決思路
    (1)情況之一:如果天氣是晴天橙喘,按照黃明的女朋友需要下雨的條件渴杆,黃明的老媽需要下雨或下雪的條件磁奖,則她們倆就都不需要通知了。
    (2)情況之二:如果天氣是下雨身诺,則黃明的女朋友需要通知霉赡,而黃明的老媽也需要通知穴亏。
    (3)情況之三:如果天氣是下雪嗓化,則只需要通知黃明的老媽严肪。
  2. 實現(xiàn)步驟:
    區(qū)別對待觀察者模式中驳糯,目標父類不實現(xiàn)通知方法结窘,在子類中實現(xiàn)有區(qū)別的通知方法。
    狀態(tài)變更調(diào)用通知方法谓苟,通知方法調(diào)用觀察者涝焙,同時回調(diào)目標對象


責任鏈模式

1. 什么是責任鏈模式

將接收者對象連成一條鏈仑撞,并在該鏈上傳遞請求隧哮,直到有一個接收者對象處理它。通過讓更多對象有機會處理請求采蚀,避免了請求發(fā)送者和接收者之間的耦合榆鼠。

2. 如何實現(xiàn)責任鏈模式

流程是 顧客申請折扣,觸發(fā)priceHandler對請求價格的處理责静,在處理價格之前通過工廠方法創(chuàng)建了一個priceHandler的實例灾螃,如果實例處理不了折扣嵌赠,觸發(fā)后繼姜挺,然后調(diào)用工廠設(shè)置后繼并創(chuàng)建新的PriceHandler來處理折扣炊豪,還是處理不了繼續(xù)申請词渤,直到成功。

3. 責任鏈模式如何解耦

加入了新的能夠折扣處理的成員lead類繼承了PriceHandler
對工廠方法進行了改動 添加了lead的實例高氮,以及給lead設(shè)置了后繼Successor

1剪芍、OO的一些原則:
2紊浩、如 單一職責原則 : 設(shè)置一個接口時,應該只將與這個接口業(yè)務相關(guān)的方法放在接口之中口芍。
3鬓椭、工場方法的實質(zhì)在用返回返回的是一個接口小染,而不是一個實例對象资盅。
4呵扛、用到責任鏈今穿,總會用到工廠

將指定的方法移到某個文件中的快捷鍵操作方式:
選中方法名——Refactor——Move——選擇需要移動到的目標文件——確定


責任鏈模式:使用了自身對象后繼



解耦---


責任鏈模式真的好嗎
  1. 開閉原則(OO中的一個基本原則):

對擴展開放,對變更關(guān)閉,即是如果有一個業(yè)務變更,希望新增一個類,而非修改原有代碼來滿足業(yè)務需求.

  1. 責任鏈模式的執(zhí)行性能:

當有請求到達時會從責任鏈頭部開始遍歷整條責任鏈,直到有一個處理器處理了請求,或者是整個鏈條遍歷完成,在這過程中性能的損耗體現(xiàn)在兩個方面.

(1)是時間,相對于單個Handler處理請求的時間而言,整個鏈條的遍歷過程會消耗更多的時間.

(2) 是內(nèi)存,使用責任鏈模式創(chuàng)建了大量對象來表示處理器對象,但僅僅使用了其中的少部分,剩余的大部分處理器都僅僅作為一個過客.

4. 責任鏈模式的應用

責任鏈模式在日常編碼中可能不是經(jīng)常用到的模式,但不管是前端還是后端工程師都可能天天接接觸到責任鏈模式.

后端:Java中的異常處理;
前端:JavaScript Event Model芝薇;
Java Web:FilterChain in Web(不純的COR)

1. JAVA中的異常處理機制是使用責任鏈模式
2. JavaScript的事件模式也是責任鏈模式
3. JAVAEE中的Filter

(1)JAVAEE中的Filter經(jīng)陈猓可以在請求到達核心代碼之前對它進行攔截并作出一些操作,當多個Filter存在的時候就共同構(gòu)成了一個FilterChain,FilterChain不是一個存的責任鏈,責任鏈模式中只能有一個對象來處理請求,而FilterChain中可以有多個對象同時處理請求.

5. 各個模式間的聯(lián)系

設(shè)計模式的學習一定要結(jié)合OO的基本原則
面向?qū)ο蟮奈宕笤瓌t:

  1. 單一職責原則
  2. 開放封閉原則(對擴展開放口注,對變更封閉)
    1. 依賴倒置原則(核心是依賴抽象)
    1. 接口隔離原則
    1. Liskov替換原則(里氏替換原則)

策略模式

1. 什么是策略模式

策略模式將可變的部分從程序中抽象分離成算法接口寝志,在該接口下分別封裝一系列算法實現(xiàn)。
并使他們可以互相替換乐导。
從而導致客戶端程序獨立于算法的改變旺拉。

2. 策略模式如何實現(xiàn)

鴨子應用的更新需求


鴨子飛行
方案一:繼承



方案二:抽象方法



方案三:組合

1.Favor composition over inheritance:復合(組合)優(yōu)先于繼承仪媒。多用組合规丽,少用繼承冰抢。



2.組合定義:在類中增加一個私有域挎扰,引用另一個已有的類的實例遵倦,通過調(diào)用引用實例的方法從而獲得新的功能,這種設(shè)計被稱作組合(復合)(意思就是:得到其他類的對象掠哥,使用這個對象的方法续搀。)


3. 策略模式總結(jié)

一禁舷、策略模式設(shè)計原則:
  1. 找出應用中需要變化的部分,把他們獨立出來霜大,不要和那些不需要變化的代碼混在一起战坤;
    將不變的東西抽象為接口途茫,而變化的部分交給實現(xiàn)去做囊卜,具體而言雀瓢,鴨子飛行的行為是千變?nèi)f化的刃麸,但是鴨子具有飛行行為本身是不變的泊业,我們將不變的部分抽象為飛行策略接口吁伺,而將具體的飛行行為交給實現(xiàn)去處理篮奄。
  2. 面向接口編程,而不是面向?qū)崿F(xiàn)編程间校。
  3. 多用組合页慷,少用繼承。
二州袒、策略模式的實現(xiàn):
  1. 通過分離變化得出策略接口Strategy郎哭。
  2. 編寫Strategy的實現(xiàn)類夸研。
  3. 客戶端程序“有一個”Strategy亥至。
  4. 在客戶程序中選擇/組裝正確的Strategy實現(xiàn)絮供。
三茶敏、策略模式的優(yōu)點:
  1. 使用了組合萍肆,使架構(gòu)更加靈活塘揣。
  2. 富有彈性亲铡,可以較好的應對變化(開閉原則)奖蔓。
  3. 更好的代碼復用性(相對于繼承)吆鹤。
  4. 消除了大量的條件語句疑务。
四知允、策略模式的缺點:
  1. 客戶代碼需要了解每個策略實現(xiàn)的細節(jié),不然就會使得實現(xiàn)有可能有不正確的行為涤垫。
  2. 隨著時間的推移,策略接口會急劇膨脹股缸,增加了對象的數(shù)目敦姻。
五镰惦、策略模式的適用場景:
  1. 許多相關(guān)的類僅僅是行為差異,將差異的共享分離出來成為一個策略接口茵瘾,而這些相關(guān)的類便成為其算法家族的成員拗秘。
  2. 運行時選取不同的算法變體雕旨。
  3. 通過條件語句在多個分支中選取一個,使用策略模式使得代碼更加簡潔疹蛉。

4. 實際案例分享

模板方法模式

1. 什么是模板方法模式

(1) 模板模式

定義了一個操作中的算法骨架,而將一些步驟延遲到子類中實現(xiàn),使得子類在不改變一個算法結(jié)構(gòu)的同時,就重新定義該算法的特定步驟.


=>


(2) 生活案例——飲料的調(diào)制方法


=>


2. 如何實現(xiàn)模板方法模式

  1. 定義抽象基類
    (1)實現(xiàn)方法(通用共同屬性)
    (2)抽象方法(延遲方法)
    (3)鉤子方法(擴展點)
    (4)模板方法(一定要用final因為要禁止子類對方法框架的覆寫)
  2. 子類

模板方法的基本實現(xiàn)

思想
1、一份算法框架座慰,大家共同遵守
2、 算法框架中分離出變與不變的部分
3误墓、將變化的算法,延遲實現(xiàn)(交由具體的子類實現(xiàn))
基本實現(xiàn)
1然想、用一個抽象基類变泄,一個public final方法定義好算法框架
2妨蛹、不變的部分,用private方法加以實現(xiàn)颤难。(基本方法)
3行嗤、變化的部分昂验,用protected abstract加以定義(抽象方法)
使用
1既琴、面向接口編程
2、傳入實際的實現(xiàn)子類給接口變量
3磺箕、接口變量調(diào)用框架方法

用鉤子(Hook)函數(shù)實現(xiàn)子類對算法框架個性化的擴展

1松靡、思想
框架通過提供一個個的鉤子,使框架具備了更大的靈活性屠列。不想執(zhí)行算法框架中的某些個步驟笛洛,我們可以脫鉤苛让,如果想執(zhí)行的話溉贿,我們可以掛鉤浦旱。
2宣蠕、實現(xiàn)
在抽象類中抢蚀,提供protected鉤子方法。這是個實現(xiàn)的或空的方法吴侦。這樣子類就可以選擇覆寫-持鉤劫樟,也可以選擇不覆寫-脫勾。
3附较、使用
提供一個isXXX類型的鉤子方法拒课。用該方法控制算法框架中
4、某個步驟是否執(zhí)行
子類不覆寫這個方法扎酷,就是脫鉤,仍按框架邏輯執(zhí)行幅聘,一旦覆寫凡纳,就是掛鉤,將改變框架算法方向帝蒿,按子類邏輯執(zhí)行荐糜。

3. 模板方法模式的特點

一、模板方法模式的實現(xiàn)要素:

準備一個抽象類葛超,將部分邏輯以具體方法的形式實現(xiàn)暴氏,然后聲明一些抽象方法交由子類實現(xiàn)剩余邏輯,用鉤子方法給予子類更大的靈活性。最后將方法匯總構(gòu)成一個不可改變的模板方法。

二、從類的角度看:

(1)抽象基類
1、基本方法。
2、抽象方法【只知道具體原則灵嫌,而不知道實現(xiàn)細節(jié)绪穆,需要將其延遲到子類中實現(xiàn)的一些步驟】第岖。
3键袱、可選鉤子(Hook比藻,鉤子函數(shù)务蝠,提供一個默認或空的實現(xiàn)。具體的子類可以自行決定是否掛鉤以及如何掛鉤)。
4淋肾、Template方法(final 使其不能被子類所覆寫 模板方法模式要遵循的原則:子類可以替換掉父類中的可變邏輯杠河,但不能改變整體邏輯結(jié)構(gòu)))陪白。
(2)具體子類
1序厉、實現(xiàn)基類中的抽象方法。
2、覆蓋鉤子方法。

三粥帚、模板方法的優(yōu)點:

(1)封裝性好掂恕。(2)復用性好。(3)屏蔽細節(jié)。(4)便于維護。

四、模板方法的缺點:

(1)繼承限制(Java語言是單繼承語言)忽舟,單繼承會使得更多情況不可用,新類引入困難。

五骆莹、模板方法模式的適用場景:

(1)算法或操作遵循相似的邏輯蒸走。
(2)重構(gòu)時(把相同的代碼抽取到父類中)掸掸。
(3)重要粒督、復雜的算法礁哄,核心算法設(shè)計為模板方法蚀乔。

4. 模板方法模式在項目中的應用

電信聯(lián)通移動三大運營商日志需求分析
解決方案1
解決方案1.2 提供擴展點,使用鉤子函數(shù)實現(xiàn)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末威彰,一起剝皮案震驚了整個濱河市慨代,隨后出現(xiàn)的幾起案子想暗,更是在濱河造成了極大的恐慌互婿,老刑警劉巖僧凤,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異怕篷,居然都是意外死亡,警方通過查閱死者的電腦和手機公给,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哎甲,“玉大人,你說我怎么就攤上這事平项⊥址” “怎么了征讲?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長挤牛。 經(jīng)常有香客問我痘括,道長只冻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任饵隙,我火速辦了婚禮故俐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布枫绅。 她就那樣靜靜地躺著,像睡著了一般父叙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上析既,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機與錄音葵第,去河邊找鬼棠赛。 笑死哮奇,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的睛约。 我是一名探鬼主播鼎俘,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼辩涝!你這毒婦竟也來了贸伐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤膀值,失蹤者是張志新(化名)和其女友劉穎棍丐,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體沧踏,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡歌逢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了翘狱。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秘案。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖潦匈,靈堂內(nèi)的尸體忽然破棺而出阱高,到底是詐尸還是另有隱情,我是刑警寧澤茬缩,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布赤惊,位于F島的核電站,受9級特大地震影響凰锡,放射性物質(zhì)發(fā)生泄漏未舟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一掂为、第九天 我趴在偏房一處隱蔽的房頂上張望裕膀。 院中可真熱鬧,春花似錦勇哗、人聲如沸昼扛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抄谐。三九已至渺鹦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間斯稳,已是汗流浹背海铆。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工迹恐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留挣惰,地道東北人。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓殴边,卻偏偏與公主長得像憎茂,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子锤岸,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 設(shè)計模式匯總 一竖幔、基礎(chǔ)知識 1. 設(shè)計模式概述 定義:設(shè)計模式(Design Pattern)是一套被反復使用、多...
    MinoyJet閱讀 3,947評論 1 15
  • 工廠模式類似于現(xiàn)實生活中的工廠可以產(chǎn)生大量相似的商品是偷,去做同樣的事情拳氢,實現(xiàn)同樣的效果;這時候需要使用工廠模式。簡單...
    舟漁行舟閱讀 7,766評論 2 17
  • 一蛋铆、設(shè)計模式的分類 總體來說設(shè)計模式分為三大類: 創(chuàng)建型模式馋评,共五種:工廠方法模式、抽象工廠模式刺啦、單例模式留特、建造者...
    RamboLI閱讀 749評論 0 1
  • 設(shè)計模式基本原則 開放-封閉原則(OCP),是說軟件實體(類玛瘸、模塊蜕青、函數(shù)等等)應該可以拓展,但是不可修改糊渊。開-閉原...
    西山薄涼閱讀 3,798評論 3 14
  • 原文鏈接:http://blog.csdn.net/zhangerqing http://www.cnblogs....
    孤獨雜貨鋪閱讀 1,516評論 0 3