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