czwartek, 13 stycznia 2022

[3] Wzorce projektowe - C# - Fasada

W tym poście chciałbym opisać wzorzec projektowy fasada. 


Głównym zadaniem fasady jest uproszczenie bardziej zaawansowanej części całego systemu. Uproszczenie polega na odizolowaniu części systemu w osobnej klasie. 

Poniżej prosty przykład fasady obsługującej trzy klasy wykonujące operacje dodawania, odejmowania oraz mnożenia podanych wartości.

  1. public class Facade
  2. {
  3.     protected AddData addData;
  4.     protected SubstractData substractData;
  5.     protected MultipleData multipleData;
  6.  
  7.     public Facade(AddData addData, SubstractData substractData, MultipleData multipleData)
  8.     {
  9.         this.addData = addData;
  10.         this.substractData = substractData;
  11.         this.multipleData = multipleData;
  12.     }
  13.     public void MakeCalculation(int val1, int val2)
  14.     {
  15.         Console.WriteLine(addData.GetOperationVal(val1, val2));
  16.         Console.WriteLine(substractData.GetOperationVal(val1, val2));
  17.         Console.WriteLine(multipleData.GetOperationVal(val1, val2));
  18.     }
  19. }
  20.  
  21. public class AddData
  22. {
  23.     public int GetOperationVal(int val1, int val2)
  24.     {
  25.         return addData(val1, val2);
  26.     }
  27.  
  28.     private int addData(int val1, int val2)
  29.     {
  30.         return (val1 + val2);
  31.     }
  32. }
  33.  
  34. public class SubstractData
  35. {
  36.     public int GetOperationVal(int val1, int val2)
  37.     {
  38.         return substractData(val1, val2);
  39.     }
  40.  
  41.     private int substractData(int val1, int val2)
  42.     {
  43.         return (val1 - val2);
  44.     }
  45. }
  46.  
  47. public class MultipleData
  48. {
  49.     public int GetOperationVal(int val1, int val2)
  50.     {
  51.         return multipleData(val1, val2);
  52.     }
  53.  
  54.     private int multipleData(int val1, int val2)
  55.     {
  56.         return (val1 * val2);
  57.     }
  58. }
  59.  
  60. class Program
  61. {
  62.     static void Main(string[] args)
  63.     {
  64.         AddData _addData = new AddData();
  65.         SubstractData _substractData = new SubstractData();
  66.         MultipleData _multipleData = new MultipleData();
  67.         Facade facade = new Facade(_addData, _substractData, _multipleData);
  68.         facade.MakeCalculation(30, 15);
  69.  
  70.         Console.ReadKey();
  71.     }
  72. }

Najpierw tworzone są obiekty klas, które są przekazywane do fasady, gdzie następuje wykonanie obliczeń dla wszystkich z nich. Można to również wykonać przez przeniesienie tworzenia obiektu bezpośrednio do fasady, przez co kod zostaje bardziej uproszczony.

  1. public class Facade
  2. {
  3.     protected AddData addData;
  4.     protected SubstractData substractData;
  5.     protected MultipleData multipleData;
  6.  
  7.     public Facade()
  8.     {
  9.         this.addData = new AddData();
  10.         this.substractData = new SubstractData();
  11.         this.multipleData = new MultipleData();
  12.     }
  13.  
  14.     public void MakeCalculation(int val1, int val2)
  15.     {
  16.         Console.WriteLine(addData.GetOperationVal(val1, val2));
  17.         Console.WriteLine(substractData.GetOperationVal(val1, val2));
  18.         Console.WriteLine(multipleData.GetOperationVal(val1, val2));
  19.     }
  20. }
  21.  
  22. public class AddData
  23. {
  24.     public int GetOperationVal(int val1, int val2)
  25.     {
  26.         return addData(val1, val2);
  27.     }
  28.  
  29.     private int addData(int val1, int val2)
  30.     {
  31.         return (val1 + val2);
  32.     }
  33. }
  34.  
  35. public class SubstractData
  36. {
  37.     public int GetOperationVal(int val1, int val2)
  38.     {
  39.         return substractData(val1, val2);
  40.     }
  41.  
  42.     private int substractData(int val1, int val2)
  43.     {
  44.         return (val1 - val2);
  45.     }
  46. }
  47.  
  48. public class MultipleData
  49. {
  50.     public int GetOperationVal(int val1, int val2)
  51.     {
  52.         return multipleData(val1, val2);
  53.     }
  54.  
  55.     private int multipleData(int val1, int val2)
  56.     {
  57.         return (val1 * val2);
  58.     }
  59. }
  60.  
  61. class Program
  62. {
  63.     static void Main(string[] args)
  64.     {
  65.         Facade facade = new Facade();
  66.         facade.MakeCalculation(30, 15);
  67.  
  68.         Console.ReadKey();
  69.     }
  70. }