模板方法模式
前言
行为型设计模式 关注对象和行为的分离。
关于父类与子类 调用时候 具体调用的哪一个?
普通方法 | 调用 | 编译时决定 | 左边决定 |
抽象/虚方法 | 调用 | 运行时决定 | 右边决定 |
介绍
设计模式 | 定义 | 案例 |
模板方法模式 | 父类 定义了业务流程,其中一部分 延迟到子类自己去完成 (通过虚方法/抽象方法) 和框架搭建很像:定义流程,实现了通用部分,可变部分传下去给子类 | 不同年龄段的模特走秀 上台后有特殊pose |
问题堆积在哪里 | 解决办法 | 解释 |
show的内容不同 小朋友有特殊pose | 父类中 定义了通用的流程 抽象方法其中: show的部分(必须有 所以用抽象) 虚函方法其中: 特殊pose部分(可有可无 所以用虚方法) | 感觉:把类当做函数,其中虚方法/抽象方法 就是变量! |
类图
代码例子
BaseModel
using UnityEngine;public abstract class BaseModel
{public void Show(){// 上台Up();// 摆pose : 虚方法 有默认的pose 也可以Pose();// 开始show : 抽象方法不同的模特有不同的show过程Begin();// 下台Down();}// 开始 showpublic abstract void Begin();// 摆 Posepublic virtual void Pose(){Debug.Log("Pose1");}private void Up(){Debug.Log("上台");}private void Down(){Debug.Log("下台");}
}
KidModel
using UnityEngine;public class KidModel : BaseModel
{public override void Begin(){Debug.Log("小朋友模特开始 show!");}// 小朋友自己设计一个posepublic override void Pose(){Debug.Log("我是可爱的天使!");}
}
AdultModel
using UnityEngine;public class AdultModel : BaseModel
{public override void Begin(){Debug.Log("成年模特开始 Show!");}
}
OldModel
using UnityEngine;public class OldModel : BaseModel
{public override void Begin(){Debug.Log("大龄模特开始show!");}
}
使用
using UnityEngine;public class Emcee : MonoBehaviour
{void Start(){Debug.Log("---------------------------成年模特");{BaseModel model = new AdultModel();model.Show();}Debug.Log("---------------------------小孩模特");{BaseModel model = new KidModel();model.Show();}Debug.Log("---------------------------老年模特");{BaseModel model = new OldModel();model.Show();}}}