模板方法模式在unity3d里面的使用

 

武学之道,重在传承。在世代的传承中,每种武学都会有新的属性。往往是一代更比一代xooxxoox-强。举个例子,在《笑傲江湖》里,风清扬虽然出场不多,但是武功极高啊,这个老头真的很不简单,独孤九剑更是厉害的发毛哦。还记得华山之巅,“淫贼”田伯光找令狐冲比武的情景吧。风清扬把独孤九剑的心法招式传给了令狐冲。然后PK,然后令狐冲比较屌,更胜一筹赢了老色(田伯光)。那么野猪从这个小情节中,来讲述一下行为里里面的模板方法模式。

修炼模板方法模式的心法如下:
1)抽象模板角色AbstractClass:定义一个或多个抽象操作,一般是一个具体的方法,也就是一个框架,实现对基本方法的调度,完成固定的逻辑。这个固定逻辑是一个顶级的逻辑框架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现。
2)具体模板角色ConcreteClass:实现父类定义的一个或多个抽象方法,是顶级逻辑的组成步骤。每一个抽象模版角色都可以有任意多个具体模版角色与之对应,而每一个具体模版角色都可以给出这些抽象方法(也就是顶级逻辑的组成步骤)的不同实现,从而使得顶级逻辑的实现各不相同。

修炼模板方法模式的武功套路如下:
 
(备注:面是模板模式demo里面的定向关系图文档的截图!)


修炼心法与武功套路的对应:
1)抽象模板角色AbstractClass对应武功套路里面的AbstractAnimationController。
2)具体模板角色ConcreteClass对应武功套路里面的ConcreteHeroAnimationController和ConcreteEnemyAnimationController。

上面描述了模板方法模式的修炼心法和武功套路。下面就给出具体的套路细节。
建议:看下面代码之前,可以先根据装饰模式的心法及对应的武功套路先行修炼。

抽象模板角色:


using UnityEngine;
using System.Collections;

namespace TemplateMethod
{
/// <summary>
/// 定义模板方法的抽象模板
/// </summary>
public abstract class AbstractAnimationController
{
protected abstract void PlayAnimation();
protected abstract void StopAnimation();
protected abstract void PauseAnimation();

public  void ShowKongFu()
{
PlayAnimation();
StopAnimation();
PauseAnimation();
}
}
}

具体模板角色:
具体模板一:令狐冲动画模板


using UnityEngine;
using System.Collections;

namespace TemplateMethod
{
/// <summary>
/// 模板方法里面的具体模板-英雄的动画控制
/// </summary>
public class ConcreteHeroAnimaionController : AbstractAnimationController
{
protected override void PlayAnimation()
{
Debug.Log("播放令狐冲独孤九剑的招式动画");
}

protected override void StopAnimation()
{
Debug.Log("停止令狐冲独孤九剑的招式动画");
}

protected override void PauseAnimation()
{
Debug.Log("暂停令狐冲独孤九剑的招式动画");
}
}
}

具体模板二:田伯光动画模板


using UnityEngine;
using System.Collections;

namespace TemplateMethod
{
/// <summary>
/// 模板方法的具体模板-敌人的动画控制
/// </summary>
public class ConcreteEnemyAnimaionController : AbstractAnimationController
{
protected override void PlayAnimation()
{
Debug.Log("播放田伯光快刀的动画");
}

protected override void StopAnimation()
{
Debug.Log("停止田伯光快刀的动画");
}

protected override void PauseAnimation()
{
Debug.Log("暂停田伯光快刀的动画");
}
}
}

客户端测试类:


using UnityEngine;
using System.Collections;

namespace TemplateMethod
{
/// <summary>
/// 模板方法的测试类
/// </summary>
public class TemplateMethodClient:MonoBehaviour
{
AbstractAnimationController enemyAnimationController;
AbstractAnimationController heroAnimationController;

void Start()
{
enemyAnimationController = new ConcreteEnemyAnimaionController();
heroAnimationController = new ConcreteHeroAnimaionController();
}

void OnGUI()
{
if (GUILayout.Button("田伯光武功招式"))
{
enemyAnimationController.ShowKongFu();
}

if (GUILayout.Button("令狐冲武功招式"))
{
heroAnimationController.ShowKongFu();
}
}
}
}

搞懂了上面的武功心法和武功套路,你也就领悟了模板方法模式。每种武功都有他的优缺点和解决问题的侧重点。So,come on,请往下看:
模板方法的优点:
1)封装不变部分,扩展可变部分。
2)提取公共代码部分,实现了代码复用,便于日后维护,不至于被小伙伴打。
3)行为有父类控制,子类进行实现,同时子类在实现时可以通过扩展方式增加相应的功能,符合开放封闭原则(OCP)。

模板方法的缺点:
1)因为引入了一个抽象类,如果具体实现过多的话,需要用户或开发人员需要花更多的时间去理清类之间的关系。
2)模板方法中子类对付类产生影响,这在复杂的项目中,会带来代码阅读的难度,让新手产生不适感。

GoF23设计模式里面的每种模式都是针对某类特定问题的解决策略。所以没有什么设计模式是完美的!

好了,本篇文章关于模板方法模式就讲到这里。敬请期待如何修炼创建者模式。