Strategy Template - Correct Implementation

I am using this template for the first time and using C #.

I just wanted to verify that this is the correct implementation.
I have a button on Winform, and when I click on it, some data in a certain format will be displayed, determined by the choice from the drop-down list. Now this may change in the future, so I use the strategy template to encapsulate the changes.

I have a "strategy interface" that simply provides one method: "Show data ()".

On my button click, I use the following code:

private void ConfirmButton_Click(object sender, EventArgs e)
    {
        IViewData viewData;

        switch (outputMedia)
        {
            case "Excel":
                viewData = new ExcelOutput(operation, study);
                viewData.DisplayData();
                break;
            case "Spotfire":
                viewData = new SpotfireOutput(operation, study);
                viewData.DisplayData();
                break;
        }


    }

? , , "" switch.

.

+3
3

, IViewData . Factory. IViewData , .

.

private IViewData CreateViewData()
{
    IViewData viewData;

    switch (outputMedia)
    {
        case "Excel":
            viewData = new ExcelOutput(operation, study);
            break;
        case "Spotfire":
            viewData = new SpotfireOutput(operation, study);
            break;
    }
    return viewData;
}

...

private void ConfirmButton_Click(object sender, EventArgs e)
{
    IViewData viewData = CreateViewData();

    viewData.DisplayData();
}

, Factory. Dictionary switch , ( ), ...

+4

, viewData.DisplayData(); . . DisplayData - , .

case . , , Dictionary<string,Func<Operation,Study,IViewData>>. , .

+2

switch , , . , , IViewData.

private void ConfirmButton_Click(object sender, EventArgs e)
{
    IViewData viewData = ViewDataController.GetViewDataController(outputMedia, operation, study);

   viewData.DisplayData();

}

And then in your controller:

 public class ViewDataController
 {
    public static IViewData GetViewDataController(string outputMedia, string operation, string study)
    {
      IViewData viewData = null;

      switch (outputMedia)
      {
        case "Excel":
            viewData = new ExcelOutput(operation, study);
            break;
        case "Spotfire":
            viewData = new SpotfireOutput(operation, study);
            break;
      }
      return viewData;
     }

This will allow you to reuse the same code throughout the application, and if you ever need to add any entries to the switch statement, you only need to do this in one place.

+1
source

Source: https://habr.com/ru/post/1791998/


All Articles