游戏中的设计模式六:模板模式

发表于2018-03-26
评论0 1.3k浏览
上一篇给大家介绍了策略模式,本篇文章我们就来说说设计模式中的模板模式,有的地方也叫模板方法模式。

游戏中的各个武器一套攻击动作有固定的步骤,但是每个步骤根据武器对象的不同,而细节的实现不同,此时使用模板方法定义一个操作中的方式/算法的骨架,意思就是说在父类里定义一个完成该事情的总步骤。每个步骤的具体实现,由子类完成实现,不同子类的实现方式/算法不尽相同。

模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤的实现延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中某些步骤的具体实现。

案例结构图

武器倚天剑和屠龙刀都继承自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. 存在一种反向的控制结构,通过一个父类调用子类的操作,通过子类对父类进行扩展新的行为,符合“开闭原则”

模式缺点

每个不同的对象实现都需要定义一个子类,将导致类的个数庞大

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

0个评论