模板方法模式
模板方法模式是一种类行为型模式,在类中定义算法骨架,包含一些实现步骤和抽象步骤,其中抽象步骤由子类实现,使子类可以在不改变算法结构的情况下重定义该算法的特定步骤。
模板方法模式其实就是子类反向控制父类里的方法,来达到特定步骤的重写。这里的算法是指一种流程,或者一系列步骤。
模板方法中有三种步骤方法
- 抽象方法 - 由子类进行完成的方法
- 实现方法 - 父类中实现的方法,本身不会改变
- 钩子方法(Hook)- 在父类中实现或者为空的方法,由其子类选择性重写,主要有两种
- 判断逻辑方法(一般有默认实现)
- 虚方法(可空 或 有默认实现)
结构
说明
- 抽象类(Abstract Class)- 负责完成算法骨架,定义相关步骤方法,抽象方法和实现方法等。
- 子类(Concrete Class)- 实现父类抽象方法,选择性完成父类中的虚方法。
实现
攻击管理 (抽象类)
public abstract class AttackManage
{
public void Attack()
{
//Hook方法
if (!IsAttack())
{
DisAttack();
return;
}
//攻击前
AttackEnter();
//攻击
OnAttack();
//攻击后
OnAttackExit();
}
protected virtual void AttackEnter() { }
protected virtual void OnAttackExit() { }
protected abstract void OnAttack();
private void DisAttack()
{
Debug.Log("无法攻击");
}
protected virtual bool IsAttack() => true;
}
子类
public class PlayerAttack : AttackManage
{
protected override void AttackEnter()
{
base.AttackEnter();
Debug.Log("玩家攻击前");
}
protected override void OnAttack()
{
Debug.Log("Player 攻击");
}
protected override void OnAttackExit()
{
base.OnAttackExit();
Debug.Log("玩家攻击后");
}
}
调用
public class TemplateExample : MonoBehaviour
{
private void Start()
{
AttackManage attackManage = new PlayerAttack();
attackManage.Attack();
}
}
应用场景
- 当你需要将算法或流程中一些特定步骤分别实现时,可以使用模板方法模式。
- 对于算法许多步骤相同的部分,我们可以使用模板方法模式,来提供代码的重用。
优缺点
优点
- 减少重复代码
- 通过子类反向控制的方式重写特定步骤,使得算法需改对客户端影响减小。
缺点
- 通过子类反向控制,违反里氏替换原则
- 如果步骤过多,算法骨架过大,维护困难
模板方法模式非常常用,但不可滥用,对于某些流程的控制非常有效。
🍦🍦🍦🍦🍦