博客地址: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、存在一种反向的控制结构,通过一个父类调用子类的操作,通过子类对父类进行扩展新的行为,符合“开闭原则”
模式缺点
每个不同的对象实现都需要定义一个子类,将导致类的个数庞大