陈巧倩

设计模式-模版方法模式

· 191 words · 1 minutes to read
Categories: CSharp
Tags: Design Pattern

Template Method模版方法模式属于行为型设计模式,定义操作中算法的框架,将一些步骤推迟到子类。模板方法允许子类在不改变算法结构的情况下重新定义算法的某些步骤。

Design Pattern:Template Method 🔗

基本介绍 🔗

构成 🔗

  • AbstractClass:抽象角色类,定义模板方法和抽象操作。
  • ConcreteClass:具体角色类,继承抽象角色类并覆盖抽象角色类操作的子类。

优点 🔗

  • 易于处理和更高的可读性,易于维护,不影响其他具体角色类运行。
  • 减少了代码重复。

缺点 🔗

  • 如果抽象操作过多,子类必须覆盖的操作太多,整个程序就会变得复杂。
  • 具体角色类不能改变算法结构的运行步骤。

实例 🔗

C#中模版方法模式的实例,我下定决心改行当厨师,于是我来到了家族旗下的酒店的厨房当起了学徒。

/// <summary>
/// 抽象角色类
/// </summary>
public abstract class AbstractClass
{
    /// <summary>
    /// 做包子流程
    /// 模板方法,方法里面包含了做包子的算法步骤
    /// </summary>
    public void MakeBuns()
    {
        MakingDough();
        MakingStuffing();
        BagBuns();
        BraiseBuns();
    }

    /// <summary>
    /// 和面 相当于模板方法的第一步
    /// </summary>
    public abstract void MakingDough();

    /// <summary>
    /// 只做馅料 相当于模板方法的第二步
    /// </summary>
    public abstract void MakingStuffing();

    /// <summary>
    /// 包包子 相当于模板方法的第三步
    /// </summary>
    public abstract void BagBuns();

    /// <summary>
    /// 蒸包子 相当于模板方法的第四步
    /// </summary>
    public abstract void BraiseBuns();
}

/// <summary>
/// 肉包子
/// </summary>
public class MeatBuns : AbstractClass
{
    public override void MakingDough()
    {
        Console.WriteLine("和面的时候放些苹果汁,增加颜色和味道");
    }

    public override void MakingStuffing()
    {
        Console.WriteLine("用猪肉做馅。");
    }

    public override void BagBuns()
    {
        Console.WriteLine("包包子");
    }

    public override void BraiseBuns()
    {
        Console.WriteLine("蒸包子");
    }
}

/// <summary>
/// 蔬菜包子
/// </summary>
public class VegetablesBuns : AbstractClass
{
    public override void MakingDough()
    {
        Console.WriteLine("和面的时候放些胡萝卜汁,增加颜色和味道");
    }

    public override void MakingStuffing()
    {
        Console.WriteLine("用白菜做馅。");
    }

    public override void BagBuns()
    {
        Console.WriteLine("包包子");
    }

    public override void BraiseBuns()
    {
        Console.WriteLine("蒸包子");
    }
}

实际运行:

//肉包子
AbstractClass buns = new MeatBuns();
buns.MakeBuns();
//蔬菜包子
buns = new VegetablesBuns();
buns.MakeBuns();

结论 🔗

搬砖愉快!