CSharp: Template Method Pattern in donet core 3

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
/// <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;
       }
 
   }

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/// <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;
 }

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/// <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.");
      }
  }

  

调用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
//模板方法模式
       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();

  

 

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
***模板方法模式 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 @   ®Geovin Du Dream Park™  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示