-
[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