• CSharp: Template Method Pattern in donet core 3


     /// <summary>
        /// Basic skeleton of actions/steps
        /// 基础工程
        /// 模板方法模式Template Method Pattern
        /// geovindu,Geovin Du eidt
        /// </summary>
        public abstract class BasicEngineering
        {
            //The following method(step) will NOT vary
            /// <summary>
            /// 数学
            /// </summary>
            private void Math()
            {
                Console.WriteLine("1.应用数学");
            }
            //The following method(step) will NOT vary
            /// <summary>
            /// 软件技术
            /// </summary>
            private void SoftSkills()
            {
                Console.WriteLine("2.软件技术");
            }
            /*
            The following method will vary.It will be 
            overridden by derived classes.
            */
            /// <summary>
            /// 特别课程
            /// </summary>
            public abstract void SpecialPaper();
    
            //The "Template Method"
            /// <summary>
            /// 显示课程结构
            /// </summary>
            public void DisplayCourseStructure()
            {
                //Common Papers:
                Math();
                SoftSkills();
                //Specialized Paper:
                SpecialPaper();
                //Include an additional subject if required.
                if (IsAdditionalPaperNeeded())
                {
                    IncludeAdditionalPaper();
                }
            }
            /// <summary>
            /// 编译设计
            /// </summary>
            private void IncludeAdditionalPaper()
            {
                Console.WriteLine("4.编译设计.");
            }
            //A hook method.
            //By default,an additional subject is needed.
            /// <summary>
            /// 
            /// </summary>
            /// <returns></returns>
            public virtual bool IsAdditionalPaperNeeded()
            {
                return true;
            }
        }
    
    
        /// <summary>
        /// The concrete derived class-ComputerScience
        /// 计算机科学
        /// </summary>
        public class ComputerScience : BasicEngineering
        {
            /// <summary>
            /// 
            /// </summary>
            public override void SpecialPaper()
            {
                Console.WriteLine("3.面向对象编程");
            }
            //Not tested the hook method:
            //An additional subject is needed
        }
    
        /// <summary>
        /// The concrete derived class-Electronics
        /// 电子工程
        /// </summary>
        public class Electronics : BasicEngineering
        {
            /// <summary>
            /// 
            /// </summary>
            public override void SpecialPaper()
            {
                Console.WriteLine("3.数字逻辑与电路理论");
            }
            //Using the hook method now.
            //Additional paper is not needed for Electronics.
            /// <summary>
            /// 
            /// </summary>
            /// <returns></returns>
            public override bool IsAdditionalPaperNeeded()
            {
                return false;
            }
    
        }
    

      

       /// <summary>
        /// 模板方法模式Template Method Pattern
        /// geovindu,Geovin Du eidt
        /// </summary>
        public abstract class Game
        {
    
            /// <summary>
            /// 
            /// </summary>
            public void Run()
            {
                Start();
                while (!HaveWinner)
                    TakeTurn();
                Console.WriteLine($"Player {WinningPlayer} wins.");
            }
            /// <summary>
            /// 
            /// </summary>
            protected abstract void Start();
            /// <summary>
            /// 
            /// </summary>
            protected abstract bool HaveWinner { get; }
            /// <summary>
            /// 
            /// </summary>
            protected abstract void TakeTurn();
            /// <summary>
            /// 
            /// </summary>
            protected abstract int WinningPlayer { get; }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="numberOfPlayers"></param>
            public Game(int numberOfPlayers)
            {
                this.numberOfPlayers = numberOfPlayers;
            }
            /// <summary>
            /// 
            /// </summary>
            protected int currentPlayer;
            /// <summary>
            /// 
            /// </summary>
            protected readonly int numberOfPlayers;
        }
    
        // simulate a game of chess
        /// <summary>
        /// 
        /// </summary>
        public class Chess : Game
        {
            /// <summary>
            /// 
            /// </summary>
            public Chess() : base(2)
            {
            }
            /// <summary>
            /// 
            /// </summary>
            protected override void Start()
            {
                Console.WriteLine($"Starting a game of chess with {numberOfPlayers} players.");
            }
            /// <summary>
            /// 
            /// </summary>
            protected override bool HaveWinner => turn == maxTurns;
            /// <summary>
            /// 
            /// </summary>
            protected override void TakeTurn()
            {
                Console.WriteLine($"Turn {turn++} taken by player {currentPlayer}.");
                currentPlayer = (currentPlayer + 1) % numberOfPlayers;
            }
            /// <summary>
            /// 
            /// </summary>
            protected override int WinningPlayer => currentPlayer;
            /// <summary>
            /// 
            /// </summary>
            private int maxTurns = 10;
            /// <summary>
            /// 
            /// </summary>
            private int turn = 1;
        }
    

      

      /// <summary>
        /// 模板方法模式Template Method Pattern
        /// geovindu,Geovin Du eidt
        /// </summary>
        public static class GameTemplate
        {
            /// <summary>
            /// 
            /// </summary>
            /// <param name="start"></param>
            /// <param name="takeTurn"></param>
            /// <param name="haveWinner"></param>
            /// <param name="winningPlayer"></param>
            public static void Run(
              Action start,
              Action takeTurn,
              Func<bool> haveWinner,
              Func<int> winningPlayer)
            {
                start();
                while (!haveWinner())
                    takeTurn();
                Console.WriteLine($"Player {winningPlayer()} wins.");
            }
        }
    

      

    调用:

         //模板方法模式
                Console.WriteLine("***模板方法模式 Template Method Pattern geovindu -2.***\n");
                BasicEngineering bs = new ComputerScience();
                Console.WriteLine("计算机科学包括下列课目:");
                bs.DisplayCourseStructure();
            
               Console.WriteLine();
                bs = new Electronics();
                Console.WriteLine("电子工程包括下列课目:");
                bs.DisplayCourseStructure();
    
    
                Console.WriteLine();
                //
                var chess = new Chess(); 
                chess.Run();
                Console.WriteLine();
    
    
                //
                var numberOfPlayers = 2;
                int currentPlayer = 0;
                int turn = 1, maxTurns = 10;
                Console.WriteLine();
    
                Console.WriteLine("***2.geovindu edit ***\n");
                //
                void Start()
                {
                    Console.WriteLine($"Starting a game of chess with {numberOfPlayers} players.");
                }
    
                bool HaveWinner()
                {
                    return turn == maxTurns;
                }
    
                void TakeTurn()
                {
                    Console.WriteLine($"Turn {turn++} taken by player {currentPlayer}.");
                    currentPlayer = (currentPlayer + 1) % numberOfPlayers;
                }
    
                int WinningPlayer()
                {
                    return currentPlayer;
                }
    
                GameTemplate.Run(Start, TakeTurn, HaveWinner, WinningPlayer);
    
                Console.ReadLine();
    

      

    输出:

    ***模板方法模式 Template Method Pattern geovindu -2.***
    
    计算机科学包括下列课目:
    1.应用数学
    2.软件技术
    3.面向对象编程
    4.编译设计.
    
    电子工程包括下列课目:
    1.应用数学
    2.软件技术
    3.数字逻辑与电路理论
    
    Starting a game of chess with 2 players.
    Turn 1 taken by player 0.
    Turn 2 taken by player 1.
    Turn 3 taken by player 0.
    Turn 4 taken by player 1.
    Turn 5 taken by player 0.
    Turn 6 taken by player 1.
    Turn 7 taken by player 0.
    Turn 8 taken by player 1.
    Turn 9 taken by player 0.
    Player 1 wins.
    
    
    ***2.geovindu edit ***
    
    Starting a game of chess with 2 players.
    Turn 1 taken by player 0.
    Turn 2 taken by player 1.
    Turn 3 taken by player 0.
    Turn 4 taken by player 1.
    Turn 5 taken by player 0.
    Turn 6 taken by player 1.
    Turn 7 taken by player 0.
    Turn 8 taken by player 1.
    Turn 9 taken by player 0.
    Player 1 wins.
    

      

  • 相关阅读:
    【JAVA基础】强引用、弱引用、软引用、虚引用
    检测手机传感器【Sensor】
    Nginx下搭建flv视频服务器且支持视频拖动进度条播放
    盘点Web开源项目大集合【太全了!!】
    打造属于自己的Notepad++
    魔兽1.20E作弊内存地址全公开
    万能的js复制按钮
    js定时刷新网页
    解决flv格式视频在网页中播放问题
    程序员该如何学习新知识
  • 原文地址:https://www.cnblogs.com/geovindu/p/16773677.html
Copyright © 2020-2023  润新知