Comments
Constructor based linking of different interfaces
Code
1. using System;
2.
3. namespace DoFactory.GangOfFour.Adapter.RealWorld
4. {
5. ///
6. /// MainApp startup class for Real-World
7. /// Adapter Design Pattern.
8. ///
9. class MainApp
10. {
11. ///
12. /// Entry point into console application.
13. ///
14. static void Main()
15. {
16. // Non-adapted chemical compound
17. Compound unknown = new Compound("Unknown");
18. unknown.Display();
19.
20. // Adapted chemical compounds
21. Compound water = new RichCompound("Water");
22. water.Display();
23.
24. Compound benzene = new RichCompound("Benzene");
25. benzene.Display();
26.
27. Compound ethanol = new RichCompound("Ethanol");
28. ethanol.Display();
29.
30. // Wait for user
31. Console.ReadKey();
32. }
33. }
34.
35. ///
36. /// The 'Target' class
37. ///
38. class Compound
39. {
40. protected string _chemical;
41. protected float _boilingPoint;
42. protected float _meltingPoint;
43. protected double _molecularWeight;
44. protected string _molecularFormula;
45.
46. // Constructor
47. public Compound(string chemical)
48. {
49. this._chemical = chemical;
50. }
51.
52. public virtual void Display()
53. {
54. Console.WriteLine("\nCompound: {0} ------ ", _chemical);
55. }
56. }
57.
58. ///
59. /// The 'Adapter' class
60. ///
61. class RichCompound : Compound
62. {
63. private ChemicalDatabank _bank;
64.
65. // Constructor
66. public RichCompound(string name)
67. : base(name)
68. {
69. }
70.
71. public override void Display()
72. {
73. // The Adaptee
74. _bank = new ChemicalDatabank();
75.
76. _boilingPoint = _bank.GetCriticalPoint(_chemical, "B");
77. _meltingPoint = _bank.GetCriticalPoint(_chemical, "M");
78. _molecularWeight = _bank.GetMolecularWeight(_chemical);
79. _molecularFormula = _bank.GetMolecularStructure(_chemical);
80.
81. base.Display();
82. Console.WriteLine(" Formula: {0}", _molecularFormula);
83. Console.WriteLine(" Weight : {0}", _molecularWeight);
84. Console.WriteLine(" Melting Pt: {0}", _meltingPoint);
85. Console.WriteLine(" Boiling Pt: {0}", _boilingPoint);
86. }
87. }
88.
89. ///
90. /// The 'Adaptee' class
91. ///
92. class ChemicalDatabank
93. {
94. // The databank 'legacy API'
95. public float GetCriticalPoint(string compound, string point)
96. {
97. // Melting Point
98. if (point == "M")
99. {
100. switch (compound.ToLower())
101. {
102. case "water": return 0.0f;
103. case "benzene": return 5.5f;
104. case "ethanol": return -114.1f;
105. default: return 0f;
106. }
107. }
108. // Boiling Point
109. else
110. {
111. switch (compound.ToLower())
112. {
113. case "water": return 100.0f;
114. case "benzene": return 80.1f;
115. case "ethanol": return 78.3f;
116. default: return 0f;
117. }
118. }
119. }
120.
121. public string GetMolecularStructure(string compound)
122. {
123. switch (compound.ToLower())
124. {
125. case "water": return "H20";
126. case "benzene": return "C6H6";
127. case "ethanol": return "C2H5OH";
128. default: return "";
129. }
130. }
131.
132. public double GetMolecularWeight(string compound)
133. {
134. switch (compound.ToLower())
135. {
136. case "water": return 18.015;
137. case "benzene": return 78.1134;
138. case "ethanol": return 46.0688;
139. default: return 0d;
140. }
141. }
142. }
143. }
144.
145.
146.
147.
Compound: Unknown ------
Compound: Water ------
Formula: H20
Weight : 18.015
Melting Pt: 0
Boiling Pt: 100
Compound: Benzene ------
Formula: C6H6
Weight : 78.1134
Melting Pt: 5.5
Boiling Pt: 80.1
Compound: Alcohol ------
Formula: C2H6O2
Weight : 46.0688
Melting Pt: -114.1
Boiling Pt: 78.3