• C#设计模式---模板方法模式(Template Method Pattern)


    一、目的

    模板方法模式把不变行为搬到超类中,从而去除了子类中的重复代码。

    二、定义

    模板方法模式:在一个抽象类中定义一个操作的算法骨架,将算法骨架中某些特定的操作延迟到子类中实现。

    模板方法使得子类在不改变一个算法骨架的前提下,重新定义算法的某些特定步骤。

    三、场景

    现实生活中,我们炒菜一般遵循一个特定的步骤,无论炒什么菜,基本步骤是一样的,只是菜品不一样而已,下面我我们用模板方法模式来模拟这一场景。

    四、实现

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading.Tasks;
     6 
     7 namespace DesignMode_TemplateMethod
     8 {
     9     public abstract class CookVegetable
    10     {
    11         // 模板方法,不要把模版方法定义为Virtual或abstract方法,避免被子类重写,防止更改流程的执行顺序
    12         public void CookVegetableTemplate()
    13         {
    14             Console.WriteLine("炒蔬菜的模板方法");
    15             PourOil();
    16             HeatOil();
    17             PourVegetable();//放入何种蔬菜由具体的子类决定
    18             PourSalt();
    19             StirFry();
    20         }
    21 
    22         public void PourOil()
    23         {
    24             Console.WriteLine("往锅里倒油");
    25         }
    26         public void HeatOil()
    27         {
    28             Console.WriteLine("把油加热");
    29         }
    30 
    31         // 油热了之后倒蔬菜下去,具体哪种蔬菜由子类决定
    32         public abstract void PourVegetable();
    33 
    34         public void PourSalt()
    35         {
    36             Console.WriteLine("放入精盐");
    37         }
    38         public void StirFry()
    39         {
    40             Console.WriteLine("翻炒");
    41         }
    42     }
    43 
    44     public class CookCabbage : CookVegetable
    45     {
    46         public override void PourVegetable()
    47         {
    48             Console.WriteLine("倒入大白菜");
    49 
    50         }
    51     }
    52     public class CookPotato : CookVegetable
    53     {
    54         public override void PourVegetable()
    55         {
    56             Console.WriteLine("倒入马铃薯");
    57         }
    58     }
    59     class Program
    60     {   
    61         static void Main(string[] args)
    62         {
    63             CookPotato cookPotato = new CookPotato();
    64             CookCabbage cookCabbage = new CookCabbage();
    65 
    66             cookPotato.CookVegetableTemplate();
    67             Console.WriteLine("********************");
    68             cookCabbage.CookVegetableTemplate();
    69 
    70             Console.ReadLine();
    71         }
    72     }
    73 }
    View Code

    运行结果如下:

    五、类图

     

  • 相关阅读:
    中间件的应用
    报表和日志
    Cookie和Session
    表单的应用
    静态资源和Ajax请求
    导入导出EXEC
    DATEDIFF() 函数返回两个日期之间的时间
    解决echarts柱形图X轴标题显示不全的问题
    Sqlserver 游标 慢
    sql语句根据日期查询,本周,本月,本年,今日相关统计
  • 原文地址:https://www.cnblogs.com/3xiaolonglong/p/9609796.html
Copyright © 2020-2023  润新知