博客地址:blog.liujunliang.com.cn
寫在前面
遊戲中的各個武器一套攻擊動作有固定的步驟,但是每個步驟根據武器對象的不同,而細節的實現不同
此時使用模板方法定義一個操作中的方式/算法的骨架,意思就是說在父類裏定義一個完成該事情的總步驟
每個步驟的具體實現,由子類完成實現,不同子類的實現方式/算法不盡相同
模板方法定義一個操作中的算法的骨架,而將一些步驟延遲到子類中,模板方法使得子類可以不改變算法結構即可重定義該算法的某些特定步驟
案例結構圖
武器倚天劍和屠龍刀都繼承自IWeapon,其中PlaySkillEffect和PlayStartSound方法是模板方法
子類在這兩個方法中一些實現方式不一樣,它們各自的特定步驟放在子類中具體實現
代碼實現
創建抽象類(模板)
using UnityEngine;
using System.Collections;
public abstract class IWeapon
{
public void Attack()
{
PlaySkillEffect();
PlayStartSound();
PlayEndSound();
}
public abstract void PlaySkillEffect();
public abstract void PlayStartSound();
public void PlayEndSound()
{
Debug.Log("攻擊敵人音效");
}
}
創建擴展模板的實體類
屠龍刀
using UnityEngine;
using System.Collections;
public class TLDWeapon : IWeapon
{
public override void PlaySkillEffect()
{
Debug.Log("播放技能特效");
}
public override void PlayStartSound()
{
Debug.Log("播放屠龍刀開始音效");
}
}
倚天劍
using UnityEngine;
using System.Collections;
public class YTJWeapon : IWeapon
{
public override void PlaySkillEffect()
{
Debug.Log("播放倚天劍技能特效");
}
public override void PlayStartSound()
{
Debug.Log("播放倚天劍開始音效");
}
}
測試
using UnityEngine;
using System.Collections;
public class Main : MonoBehaviour
{
private void Start()
{
IWeapon weapon = new YTJWeapon();
weapon.Attack();
weapon = new TLDWeapon();
weapon.Attack();
}
}
驗證輸出
模式優點
1、具體的細節步驟實現定義在子類中,子類定義詳細處理算法是不會改變算法整體結構
2、代碼的複用的基本技術
3、存在一種反向的控制結構,通過一個父類調用子類的操作,通過子類對父類進行擴展新的行爲,符合“開閉原則”
模式缺點
每個不同的對象實現都需要定義一個子類,將導致類的個數龐大