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.

  

posted @ 2022-10-09 20:58  ®Geovin Du Dream Park™  阅读(27)  评论(0)    收藏  举报