模板方法模式 - Unity

模板方法模式

模板方法模式是一种类行为型模式,在类中定义算法骨架,包含一些实现步骤和抽象步骤,其中抽象步骤由子类实现,使子类可以在不改变算法结构的情况下重定义该算法的特定步骤。

模板方法模式其实就是子类反向控制父类里的方法,来达到特定步骤的重写。这里的算法是指一种流程,或者一系列步骤。


模板方法中有三种步骤方法

  • 抽象方法 - 由子类进行完成的方法
  • 实现方法 - 父类中实现的方法,本身不会改变
  • 钩子方法(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();
       }
   }

在这里插入图片描述

应用场景

  • 当你需要将算法或流程中一些特定步骤分别实现时,可以使用模板方法模式。
  • 对于算法许多步骤相同的部分,我们可以使用模板方法模式,来提供代码的重用。

优缺点

优点

  • 减少重复代码
  • 通过子类反向控制的方式重写特定步骤,使得算法需改对客户端影响减小。

缺点

  • 通过子类反向控制,违反里氏替换原则
  • 如果步骤过多,算法骨架过大,维护困难

模板方法模式非常常用,但不可滥用,对于某些流程的控制非常有效。

​🍦​🍦​🍦​🍦​🍦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值