Comments
Use of abstract and virtual access modifiers for overriding so derived classes can have their own implementations.
Code
1. using System;
2. using System.Data;
3. using System.Data.OleDb;
4.
5. namespace DoFactory.GangOfFour.Template.RealWorld
6. {
7. ///
8. /// MainApp startup class for Real-World
9. /// Template Design Pattern.
10. ///
11. class MainApp
12. {
13. ///
14. /// Entry point into console application.
15. ///
16. static void Main()
17. {
18. DataAccessObject daoCategories = new Categories();
19. daoCategories.Run();
20.
21. DataAccessObject daoProducts = new Products();
22. daoProducts.Run();
23.
24. // Wait for user
25. Console.ReadKey();
26. }
27. }
28.
29. ///
30. /// The 'AbstractClass' abstract class
31. ///
32. abstract class DataAccessObject
33. {
34. protected string connectionString;
35. protected DataSet dataSet;
36.
37. public virtual void Connect()
38. {
39. // Make sure mdb is available to app
40. connectionString =
41. "provider=Microsoft.JET.OLEDB.4.0; " +
42. "data source=..\\..\\..\\db1.mdb";
43. }
44.
45. public abstract void Select();
46. public abstract void Process();
47.
48. public virtual void Disconnect()
49. {
50. connectionString = "";
51. }
52.
53. // The 'Template Method'
54. public void Run()
55. {
56. Connect();
57. Select();
58. Process();
59. Disconnect();
60. }
61. }
62.
63. ///
64. /// A 'ConcreteClass' class
65. ///
66. class Categories : DataAccessObject
67. {
68. public override void Select()
69. {
70. string sql = "select CategoryName from Categories";
71. OleDbDataAdapter dataAdapter = new OleDbDataAdapter(
72. sql, connectionString);
73.
74. dataSet = new DataSet();
75. dataAdapter.Fill(dataSet, "Categories");
76. }
77.
78. public override void Process()
79. {
80. Console.WriteLine("Categories ---- ");
81.
82. DataTable dataTable = dataSet.Tables["Categories"];
83. foreach (DataRow row in dataTable.Rows)
84. {
85. Console.WriteLine(row["CategoryName"]);
86. }
87. Console.WriteLine();
88. }
89. }
90.
91. ///
92. /// A 'ConcreteClass' class
93. ///
94. class Products : DataAccessObject
95. {
96. public override void Select()
97. {
98. string sql = "select ProductName from Products";
99. OleDbDataAdapter dataAdapter = new OleDbDataAdapter(
100. sql, connectionString);
101.
102. dataSet = new DataSet();
103. dataAdapter.Fill(dataSet, "Products");
104. }
105.
106. public override void Process()
107. {
108. Console.WriteLine("Products ---- ");
109. DataTable dataTable = dataSet.Tables["Products"];
110. foreach (DataRow row in dataTable.Rows)
111. {
112. Console.WriteLine(row["ProductName"]);
113. }
114. Console.WriteLine();
115. }
116. }
117. }