vlambda博客
学习文章列表

C#设计模式——模板方法模式

This browser does not support music or audio playback. Please play it in Weixin or another browser.
C#设计模式——模板方法模式


我希望未来有一天,因为我的代码,让这个世界上的一些人生活的更便利
感觉到一点点幸福或愉悦。不管这些人多还是少。

前言


    模板方法模式是行为型模式。我们在使用表格文档时会有很多种模板供选择,然后再在模板的基础之上作些更改,在设计模式中,模板方法模式与之概念非常像。其作用:定义一个操作中算法的框架,而将一些步骤延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。简单点说就是:是一种基于继承的代码复用技术。

C#设计模式——模板方法模式
C#设计模式——模板方法模式

方案思路


模板方法模式有2个模块:

1:抽象类:在抽象类中定义了一系列基本操作

2:具体子类:它是抽象类的子类,用于实现在父类中声明的抽象基本操作以完成子类特定算法的步骤,也可以覆盖在父类中已经实现的具体基本操作

此模式结构非常简单,只有两种模块,在下面的示例中,每当需要演奏一首歌时新建一个类,继承抽象类,实现抽象方法添加歌曲就实现了代码的复用了。另外还添加了个钩子(hook),可以在子类中反向控制结构。

C#设计模式——模板方法模式
C#设计模式——模板方法模式

Code



C#设计模式——模板方法模式

以下代码经过测试,可直接在项目中使用

/// <summary>

/// 测试类

/// </summary>

public class templateTest : MonoBehaviour

{

    void Start()

    {

        Template templateone = new MusicOne();

        Template templatetwo = new MusicTwo();

        templateone.PlayMusic();

        templatetwo.PlayMusic();

    }

}

/// <summary>

/// 抽象类

/// </summary>

public abstract class Template

{

    private void Start()

    {

        Debug.Log("开始唱歌");

    }

    public abstract void Sing();

    private void Over()

    {

        Debug.Log("结束唱歌");

    } 

    public void PlayMusic()

    {

        if (IsPlay())

        {

            Start();

            Sing();

            Over();

        }

        else

        {

            Debug.Log("启动钩子方法。无法演奏");

        }

    }

    //钩子

    public virtual bool IsPlay()

    {

        return true;

    }

}

/// <summary>

/// 具体子类

/// </summary>

public class MusicOne : Template

{

    public override void Sing()

    {

        Debug.Log("演奏:周杰伦的《算什么男人》");

    }

}

/// <summary>

/// 具体子类

/// </summary>

public class MusicTwo : Template

{

    public override void Sing()

    {

        Debug.Log("演奏:张国荣的《玻璃之情》");

    }

    public override bool IsPlay()

    {

        return false;

    }

}


输出结果








END




感谢阅读


你知道的越多,你不知道的越多

我是EAST

一个靠互联网苟且偷生的程序员

咱们下期见!





扫描二维码关注我吧


庚子年冲冲冲 发起了一个读者讨论 留言区