ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C#] Strategy Pattern
    프로그래밍/Design Pattern 2020. 10. 23. 15:12

     전략 패턴 ( Strategy Pattern )

    최대한 간략하게 설명하자면 대부분의 메서드와 클래스를 모듈화 해서 실제로 사용할 때는 마치 부품을 조립해서 사용할 수 있도록 만드는 것이 전략패턴이 되겠습니다. Worst 와 Best 의 경우를 살펴보면 이해가 편합니다. 자동차 공정을 예시로 들어봅시다.

     

     

     

    고객1은 모든 옵션에서 1번 옵션을 선택하고

    고객2는 2번 옵션을 선택했습니다.

    이 경우 하드 코딩을 한다고 가정했을때 아래와 같은

    구조가 나옵니다. 

     

     

     

     

    고객 마다 클래스를 만들고

    클래스안에 모든 메서드를 새로 작성하여

    때려박는 방식이죠.

     

    이러한 하드코딩의 장단점은

    분명합니다.

     

    장점 : 구현이 쉽고 빠르다.

    단점 : 유지보수가 어렵다.

     

    그래서 우리는 이러한 경우전략패턴을 사용합니다.

     

     

    모든 모듈을 모듈화 하고

    결합도는 낮게, 응집도는 높게 설계를 해야 합니다.

     

    옵션별로 모듈을 하였고

    인터페이스로는 Client 와 각각의 옵션들이 있겠습니다.

     

    이렇게 모듈화를 했을때 장단점도 봅시다.

     

    장점 : 유지보수가 정말 쉽다.

    단점 : 설계가 상대적으로 어렵고 오래걸린다.

     

    유지보수가 쉽다는 의미는 아래와 같습니다.

     

     

    10000 명의 Client 가 Tire 1 을 사용하고 있습니다.

    그런데 Tire 1 이 업그레이드가 되었습니다.

     

    이러한 경우 Worst 는 10000 번의 복붙을 해야 할겁니다.

    하지만 전략패턴 방식은 모듈하나만 바꾸어 주면

    10000 개의 메서드를 모두 바꿀 수 있다는 장점이 있습니다.

     

    Tire 만을 옵션으로 두고 있다는 가정하에

    아주~~~ 짧고 ~~~~간단한 전략패턴의 예시코드를 아래에 작성했으니

    한번 보시면 도움이 될것 같습니다.

     

     

    using System;
    
    namespace ConsoleApp1
    {
        class Program
        {
            // Main Code
            static void Main(string[] args)
            {
                AbstractEngine engine1 = new Engine1();
                Client client1 = new Client(engine1);
                client1.Run();
    
                AbstractEngine engine2 = new Engine2();
                Client client2 = new Client(engine2);
                client1.Run();
            }
        }
    
        // Engine Interface
        abstract class AbstractEngine
        {
            public abstract void Run();
        }
    
        // Engine Module
        class Engine1 : AbstractEngine
        {
            public override void Run()
            {
                Console.WriteLine("Run Engine 1 \n");
            }
        }
    
        class Engine2 : AbstractEngine
        {
            public override void Run()
            {
                Console.WriteLine("Run Engine 2 \n");
            }
        }
    
        // Client Interface
        class Client
        {
            private AbstractEngine Engine;
    
            public Client ( AbstractEngine E)
            {
                Engine = E;
            }
    
            public void Run()
            {
                Engine.Run();
    
            }
    
        }
    
    }
    

    '프로그래밍 > Design Pattern' 카테고리의 다른 글

    [C#] Decorator Pattern  (0) 2020.11.06
    [C#] Observer Pattern  (0) 2020.10.30

    댓글

Designed by Tistory.