前言
本文介紹一下結構型模式中的模板方法。
模板模式是什麼
定義乙個操作的一系列步驟,對於某些暫時確定不下來的步驟,就留給子類去實現好了,這樣不同的子類就可以定義出不同的步驟。通過繼承的方式來實現模板 ,完成對父類的填充。
**案例
public abstract class greet
protected abstract void hello();
protected abstract void bey();
// 相同部分
// 也可以定義為 final 防止子類覆寫,直接被模板方法使用或者讓子類使用
void sleep ()
// 定義乙個什麼都不做的方法(或者預設的預設實現),這種方法通常稱為"hook" 鉤子。子類自己視情況來決定要不要覆蓋它們
void hock(){}
}
鉤子的用途:
使用鉤子的場景:如上所說,如果模板演算法中的某些步驟子類必須實現的話,就是用抽象演算法。如果演算法中的這個部分是可選的,就用鉤子。
// 通過手機打招呼
public class phonegreet extends greet
@override
protected void bey()
}
// 通過言語打招呼
public class wordsgreet extends greet
@override
protected void bey()
}
// 測試類
public class templatetest
}
這樣看來跟父類定義介面有什麼區別?其中某些操作還是父類來進行的。
jdk abstractqueuedsynchronizer (aqs) 的使用
僅簡單介紹一下aqs 的使用,未涉及具體原始碼分析。後續單獨寫aqs的原始碼設計思路。
aqs 是用來構建鎖或者其他同步元件的基礎框架。鎖是面向使用者的,隱藏了實現細節,aqs是面向鎖的實現者的,簡化了鎖的實現方式,對底層實現進行遮蔽。aqs的設計就是基於模板方法模式的。使用者需要繼承同步器,並重寫指定的方法。比如 countdownlatch、semaphore、renntrantlock。
下面**演示 aqs 的使用
// 自定義同步元件 在同一時刻只允許乙個執行緒占有鎖
public class newlock implements lock
// 當狀態為 0 的時候獲取鎖
@override
public boolean tryacquire(int acquire)
return false;
}// 釋放鎖
@override
protected boolean tryrelease(int arg)
setexclusiveownerthread(null);
setstate(0);
return true;
}// 返回condition 每個condition 都包含乙個 condition 佇列
condition newcondition()
}// 將鎖的操作**到 sync 上
private final sync sync = new sync();
// 阻塞獲取鎖
@override
public void lock()
/*** 可中斷地獲取鎖
** @throws interruptedexception
*/@override
public void lockinterruptibly() throws interruptedexception
// 嘗試非阻塞的獲取鎖
@override
public boolean trylock()
// 超時獲取鎖
@override
public boolean trylock(long time, timeunit unit) throws interruptedexception
// 釋放鎖
@override
public void unlock()
// 獲取等待通知元件
@override
public condition newcondition()
// 是否獲取到了鎖
public boolean islocked()
// 是否有其他執行緒在等待獲取鎖
public boolean hasqueuedthreads()
}
總結
模板方法就是父類定義一系列的操作(模板),由子類來實現某些操作。這樣可以規範子類提供某些步驟的實現。
父類可以通過 final 來定義不想被修改的骨架。對於需要子類實現的抽象方法,一般宣告為protected 這樣可以使這些方法對外部不可以見,並且只用於子類繼承可見。
references
設計模式之模板方法設計模式
父類抽象出子類共有的方法,子類實現各自不同的業務。總之就是一種行為有他們共同的方法,只是他們具體的實現不一樣。比如開車這種行為模式,啟動 換擋 踩油門。每種型號品牌的車都有共同的行為,但是不同型號品牌的車的實現方式可能不同,需要每個品牌型號的車自己實現這些功能。這樣的定義上面行為的模式,稱之為模板方...
模板設計模式 PHP設計模式之模板方法模式
模板方法模式,也是我們經常會在不經意間有會用到的模式之一。這個模式是對繼承的最好詮釋。當子類中有重複的動作時,將他們提取出來,放在父類中進行統一的處理,這就是模板方法模式的最簡單通俗的解釋。就像我們平時做專案,每次的專案流程實都差不多,都有調研 開發 測試 部署上線等流程。而具體到每個專案中,這些流...
設計模式之模板方法模式
定義 定義乙個操作中演算法的框架,而將一些步驟延遲到子類中,使得子類可以不改變演算法的結構即可重定義該演算法中的某些特定步驟 型別 行為類模式 事實上,模板方法是程式設計中乙個經常用到的模式。比如,給定乙個整數陣列,把陣列中的數由大到小順序,然後把排序之後的結果列印出來。這個需求大體可以分為兩部分,...