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

    运行结果如下:

    五、类图

     

  • 相关阅读:
    react-native Image resizeMode
    常见的前端设计模式
    Execution failed for task ':app:transformClassesAndResourcesWithProguardForRelease'.
    Error: [mobx] Since strict-mode is enabled, changing observed observable values outside actions is not allowed. Please wrap the code in an `action` if this change is intended.
    react-native 扫一扫功能(二维码扫描)功能开发
    字符串截取 及 substr 和 substring 的区别
    POST请求的forHTTPHeaderField
    使用MDScratchImageView实现刮奖效果
    计算Pan手势到指定点的角度
    CAShapeLayer的使用[2]
  • 原文地址:https://www.cnblogs.com/3xiaolonglong/p/9609796.html
Copyright © 2011-2022 走看看