美文网首页
设计模式之模板方法模式

设计模式之模板方法模式

作者: _凉笙 | 来源:发表于2017-12-08 12:05 被阅读0次

    模板方法模式:
    定义一个操作中算法的框架,而将一些步骤延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

    模板方法模式是一种基于继承的代码复用技术,它是一种类行为型模式。
    模板方法模式是结构最简单的行为型设计模式,在其结构中只存在父类与子类之间的继承关系。通过使用模板方法模式,可以将一些复杂流程的实现步骤封装在一系列基本方法中,在抽象父类中提供一个称之为模板方法的方法来定义这些基本方法的执行次序,而通过其子类来覆盖某些步骤,从而使得相同的算法框架可以有不同的执行结果。模板方法模式提供了一个模板方法来定义算法框架,而某些具体步骤的实现可以在其子类中完成。

    模板方法模式就是例如有一个去餐厅吃午餐的模板,模板如下
    点单——吃主食——买单
    在这个模板下点单和买单的方法都是一样的,唯一不一样的就是吃主食是随时可能不一样,北方人吃的主食是面,南方人主食是米饭。

    使用模板方法模式我们只需要创建两个子类南方人和北方人的子类,去继承这个模板,然后分别在这两个子类里面去重写吃主食这个方法就行了。UML图如下

    image.png 代码原型实现:
    using UnityEngine;
    
    class DM04TempleMethod : MonoBehaviour
    {
        private void Start()
        {
            //接口接入北方人
            Ipeople people = new NorthPeople();
            people.Eat();
        }
    }
    public abstract class Ipeople
    {
        public void Eat()
        {
            OrderFoods();
            EatSomething();
            PayBill();
    
        }
        public  void OrderFoods()
        {
            Debug.Log("点单");
        }
    
        protected virtual void EatSomething()
        {
    
        }
        private void PayBill()
        {
            Debug.Log("买单");
        }
    }
    public class NorthPeople : Ipeople
    {
        protected override void EatSomething()
        {
            Debug.Log("主食面");
        }
    }
    public class SouthPeople : Ipeople
    {
        protected override void EatSomething()
        {
            Debug.Log("主食米饭");
        }
    }
    

    输出模板:


    image.png

    比如我们模板里面是南方人的时候这里只需要修改IPeple就行了

    Ipeople people = new SouthPeople();
    

    模板输出结果就是如下


    image.png

    在模板方法模式中,由于面向对象的多态性,子类对象在运行时将覆盖父类对象,子类中定义的方法也将覆盖父类中定义的方法,因此程序在运行时,具体子类的基本方法将覆盖父类中定义的基本方法,子类的钩子方法也将覆盖父类的钩子方法,从而可以通过在子类中实现的钩子方法对父类方法的执行进行约束,实现子类对父类行为的反向控制。

    模板方法模式参考
    http://blog.csdn.net/lovelion/article/details/8299794
    http://meigesir.iteye.com/blog/1506484

    相关文章

      网友评论

          本文标题:设计模式之模板方法模式

          本文链接:https://www.haomeiwen.com/subject/mwsjixtx.html