然后说一下这个,给女朋友讲设计模式 之 模板方法模式

我在重构代码的时候,她又跑来了,兴奋的和我说:我在小区里看到一只超可爱的猫,我还拍了照片,你看,说着把那张图片贴我脸上.

我看了看她,笑了笑,对她说:要不我们也养只猫?她说好呀好呀,等我哪天遇到流浪猫.我就把它带回来

我说:嗯

她看了看我的电脑,又看了看我,叹了口气说:不好弄吗?

我说:就是日常重构代码,也没啥,没有卡住,现在这种模式也能用.

她又问我,你为什么隔三岔五的,就要去重构代码呢?

我回答她说:重构就是改善一下现有的设计,但是又不能过度的去设计,所以有的时候就要取舍一下,是不是应该要重构.

她说:哦,这次你想重构哪里的?

我说:上次我们一起设计的武器类,父类封装,子类调用,但是在开火的那里,好像并不是很好用,因为每个武器的属性不一样,特效,声音,伤害等等等等.如果代码一多,容易乱.

她想了想,开始沉默,我很喜欢她考虑的表情.撅着嘴,好像有什么事不开心的样子.正当我被她迷住,想去拥抱她,她忽然好像想到了什么一样,兴奋的说:如果我们在父类中就

写好流程了呢?这样每个武器是不是就都是一个流程了,只需要每个武器单独设置特效声音不就行了吗?

我愕然,没错,但是这要怎么做呢?我思考了一会,大概知道她是怎么想的了

不由得感叹,如果她要是程序员,一定比我强,说到这里,我想到了世界上第一位程序员就是一位女性.

首先,在父类中写好方法流程,然后在子类中重写,最后在调用的时候就可以修改它的属性:

using UnityEngine;

public abstract class AbstractClass 
{
    public void TemplateMethod() {

        PrimitiveOpration1();
        PrimitiveOpration2();
    }

    protected abstract void PrimitiveOpration1();
    protected abstract void PrimitiveOpration2();
}


public class ConcreteClassA : AbstractClass
{
    protected override void PrimitiveOpration1()
    {
        //throw new System.NotImplementedException();
        Debug.Log("PrimitiveOpration1 in ConcreteClassA");
    }
    protected override void PrimitiveOpration2()
    {
        //throw new System.NotImplementedException();
        Debug.Log("PrimitiveOpration2 in ConcreteClassA");
    }
}


public class ConcreteClassB : AbstractClass
{
    protected override void PrimitiveOpration1()
    {
        //throw new System.NotImplementedException();
        Debug.Log("PrimitiveOpration1 in ConcreteClassB");
    }
    protected override void PrimitiveOpration2()
    {
        //throw new System.NotImplementedException();
        Debug.Log("PrimitiveOpration2 in ConcreteClassB");
    }
}

然后在unity中对它进行调用:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class UseInUnity11 : MonoBehaviour
{


    AbstractClass ConcreteA = new ConcreteClassA();
    AbstractClass ConcreteB = new ConcreteClassB();
    // Start is called before the first frame update
    void Start()
    {
        ConcreteA.TemplateMethod();
        ConcreteB.TemplateMethod();
    }

    // Update is called once per frame
    void Update()
    {

    }
}

她又问:这次这个方法下次你还会重构掉吗?

我笑了笑,对她说:怎么会呢傻瓜.她说上次不也是我和你一起设计的吗,这次不也改了,骗人,说完气呼呼的回到自己的房间里去了.我在书房不知道为什么她会生气,不过有一点可以肯定的是,一定是我错了.

正文完