【設計模式-5】模板方法模式
阿新 • • 發佈:2018-11-29
模板方法模式
優點:
- 提高程式碼複用性
將相同部分的程式碼放在抽象的父類中 - 提高了拓展性
將不同的程式碼放入不同的子類中,通過對子類的擴充套件增加新的行為 - 實現了反向控制
通過一個父類呼叫其子類的操作,通過對子類的擴充套件增加新的行為,實現了反向控制 & 符合“開閉原則”
缺點:
每個不同的實現都需要定義一個子類,這會導致類的個數增加,系統更加龐大,設計也更加抽象,但是更加符合“單一職責原則”,使得類的內聚性得以提高。
使用場景:
1、多個子類有公共的方法,並且邏輯基本相同
2、重要、複雜的演算法,可以把核心演算法設計模板方法,周邊的相關細節功能則有各個子類實現。
Abstract Class(抽象模板類) | 定義一個或多個操作,操作可自身實現或在派生的子類中過載實現 |
Concrete Class(具體模板類) | 實現抽象模板角色中的抽象方法 |
例如:去商店買東西這個行為有共同的邏輯,但是細節不同,一個商店買橘子用微信,去另一個店買蘋果用支付寶。
//Abstract Class(抽象模板類) public abstract class BuySomething { public void GetSomething() { SelectSomething(); PayMoney(); GoOut(); } public abstract void SelectSomething(); public abstract void PayMoney(); void GoOut() { Debug.Log("拿著東西走人"); } } //Concrete Class(具體模板類) public class BuyOrange:BuySomething { public override void SelectSomething() { Debug.Log("買橘子"); } public override void PayMoney() { Debug.Log("用微信付錢"); } } //Concrete Class(具體模板類) public class BuyApple:BuySomething { public override void SelectSomething() { Debug.Log("買蘋果"); } public override void PayMoney() { Debug.Log("用支付寶"); } } public class Client: MonoBehaviour { // Use this for initialization void Start () { BuyOrange tempBuyOrange = new BuyOrange(); tempBuyOrange.GetSomething(); BuyApple tempBuyApple = new BuyApple(); tempBuyApple.GetSomething(); } }