/// <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.