zoukankan      html  css  js  c++  java
  • 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

    运行结果如下:

    五、类图

     

  • 相关阅读:
    C#利用HttpWebRequest进行post请求的示例(HTTPS)
    jQuery对象与DOM对象之间的转换方法
    解决SQL SERVER数据库备份时出现“操作系统错误5(拒绝访问)。BACKUP DATABASE 正在异常终止。”错误的解决办法
    Win10启动盘制作工具
    Silverlight5_Tools安装报错解决方案
    js 数组操作
    mac使用入门
    sql linq lamda
    SqlServer将数据库中的表复制到另一个数据库
    LoadRunner11学习记录五 -- 错误提示分析
  • 原文地址:https://www.cnblogs.com/3xiaolonglong/p/9609796.html
Copyright © 2011-2022 走看看