1. 程式人生 > >【設計模式-5】模板方法模式

【設計模式-5】模板方法模式

模板方法模式

     優點:

  1. 提高程式碼複用性 
    將相同部分的程式碼放在抽象的父類中
  2. 提高了拓展性 
    將不同的程式碼放入不同的子類中,通過對子類的擴充套件增加新的行為
  3. 實現了反向控制 
    通過一個父類呼叫其子類的操作,通過對子類的擴充套件增加新的行為,實現了反向控制 & 符合“開閉原則”

     缺點:

     每個不同的實現都需要定義一個子類,這會導致類的個數增加,系統更加龐大,設計也更加抽象,但是更加符合“單一職責原則”,使得類的內聚性得以提高。

     使用場景:

    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();
	}
}