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.
哲学管理(学)人生, 文学艺术生活, 自动(计算机学)物理(学)工作, 生物(学)化学逆境, 历史(学)测绘(学)时间, 经济(学)数学金钱(理财), 心理(学)医学情绪, 诗词美容情感, 美学建筑(学)家园, 解构建构(分析)整合学习, 智商情商(IQ、EQ)运筹(学)生存.---Geovin Du(涂聚文)
浙公网安备 33010602011771号