노출 된 디자인 패턴 : 전략 패턴



이 블로그에서는 동적으로 선택할 수있는 상호 교환 가능한 알고리즘 제품군을 만드는 데 사용되는 전략 디자인 패턴에 대해 알아 봅니다.

'

'디자인 패턴 노출'시리즈의 첫 번째 게시물에 오신 것을 환영합니다. 이 시리즈에서 우리는 각 디자인 패턴을 처음부터 발견 할 것입니다.





프로그래밍 언어와 그 구조를 아는 것만으로는 더 나은 프로그래머 또는 개발자가되지 않습니다. 현재와 ​​미래에도 작동 할 소프트웨어를 만들려면 디자인 패턴에 대한 지식이 필요합니다.

많은 개발자가 이미 현재 직면하고 있거나 앞으로 직면하게 될 설계 문제를 접했습니다. 그들은 그 문제를 다루는 표준 방법을 지정했습니다. 따라서 디자인 패턴을 사용하면 입증 된 기술을 사용하는 이점을 얻을 수 있습니다.



각 디자인 패턴은 특정 유형의 상황을 해결하기위한 것이며 둘 이상의 디자인 패턴을 사용할 수있는 상황이있을 수 있습니다.

대부분의 프로그래머는 디자인 패턴, 중복 코드 또는 긴밀한 결합에 대해 신경 쓰지 않고 직면 한 문제를 해결하려고합니다. 그러나 좋은 프로그래머는 다르게 시작합니다. 그들은 오늘날의 요구 사항, 향후 요구 사항, 코드 유지 관리 및 코드 재사용 가능성에 대해 생각합니다.

좋은 프로그래머는 요구 사항을 충족하면 서둘러 코딩을 시작하지 않습니다. 그들은 앉아서 자신의 디자인이 효과가 있는지에 대한 문제에 대해 생각합니다. 예인 경우 6 개월 후 작동 여부, 요구 사항이 변경됩니다.



좋은 프로그래머는 펜과 종이를 가지고 클래스와 클래스 간의 관계를 디자인하기 시작합니다. 그들은 디자인에서 느슨한 결합과 높은 응집력을 얻으려고 노력하지만,이 모든 작업을 수행하면서 마음 속에 객체 지향 원칙을 가지고 있습니다. 저수준 코드에 즉시 들어 가지 않습니다. 유연하고 재사용 가능한 소프트웨어를 설계하려면이 접근 방식을 따라야합니다. 그렇지 않으면 항상 이전에 작성한 코드를 수정하게됩니다.

소프트웨어 산업에서 변하지 않는 것은 단 한 가지입니다. 변화. 요구 사항은 확실히 계속 변경 될 것입니다. 그렇다면 코드가 향후 요구 사항에 쉽게 적응할 수있는 소프트웨어를 어떻게 설계할까요? 이를 위해서는 일찍 시작해야하며 향후 요구 사항으로 인해 이전 코드가 손상되지 않도록 설계해야합니다.

어떻게 할 수 있습니까?

글쎄, 그것은 이러한 원칙을 기반으로 디자인 원칙과 디자인 패턴을 따라 수행 할 수 있습니다.

이며 Java에서 관계가 있습니다.

이제 코딩에 대해 자세히 알아보고 더 나은 프로그래머가되기위한 여정을 시작하겠습니다. 이 포스트에서 우리는 가장 중요한 패턴 중 하나를 발견 할 것입니다. – 전략 패턴 .

가장 중요한 것은 Strategy Pattern으로 해결되는 공통적 인 문제를 반영합니다.

전략 패턴이란 무엇입니까?

다음은 'Gang of Four'책에서 바로 나온 정의입니다.“전략 패턴은 런타임에 필요한 프로세스를 선택하는 상호 교환 가능한 알고리즘 제품군을 만드는 데 사용됩니다.”.

당신이이해할 수 없으니 걱정하지 마세요.더 간단방법당신을 위해이해하다.

먼저 문제를 이해 한 다음 전략 패턴이 어떻게 해결할 수 있는지 살펴 보겠습니다.

위의 UML 다이어그램에는 Animal 추상 클래스와 Animal 수퍼 클래스에서 확장 된 두 개의 구체적인 클래스 인 Dog와 Bird가 있습니다.

이제 Animal 추상 클래스와 두 개의 구체적인 클래스 인 Dog와 Bird를 정의하겠습니다.

위의 디자인에 대해 어떻게 생각하십니까? 디자인에 큰 실수가 하나 있습니다.

위의 경우 개가 날 수없는 것처럼 모든 동물은 날 수 없습니다. 하지만 여전히 '파리'동작이 있습니다.

Animal 클래스 안에 abstract fly () 메서드를 작성하여 실수를했습니다. 이 디자인은 각 하위 클래스 Dog, Bird, Penguin, Crocodile, Goose 등이 fly () 메서드를 구현하도록합니다.

우리는 비행이 모든 동물이 가질 수없는 능력이라는 것을 이해해야했습니다. Animal abstract 클래스에 fly () 메서드를 제공하여 모든 하위 클래스의 비행 능력을 설정했습니다. 이는 모든 하위 클래스의 동물에 맞지 않습니다.

하위 클래스에서 fly 메서드를 구현할 때 무엇이 ​​문제인지 생각할 수 있습니다. 비행하지 않는 Animal 하위 클래스에서 fly () 메서드를 구현하여 'I ca n’t fly'만 인쇄 할 수 있지만. 하지만 문제는 여전히 날지 못하는 동물에게 파리 행동을하고 있다는 것입니다. 이것은 올바르지 않습니다.

dog.fly () 또는 crocodile.fly ()라고 부르는 느낌이 어떻습니까?

이제 우리는 우리의 디자인이 정확하지 않다는 것을 이해했으며 Animal 하위 클래스에서 fly () 메서드를 제거해야합니다.

우리의 디자인이 모든 Animal 하위 클래스가 파리 행동을 갖도록 강요하지 않는 방식으로 클래스를 디자인하는 다른 방법은 무엇입니까?

즉시 떠오르는 한 가지 해결책은 우리가 fly 방식으로 비행 인터페이스를 만들 수 있고, 날 수있는 동물 만이 그 비행 인터페이스를 구현한다는 것입니다. 이렇게하면 모든 Animal 하위 클래스가 비행 동작을 정의하도록 강제하지 않습니다. 이제이 디자인 접근 방식을 코딩 해 보겠습니다.

이제 Animal 클래스에서 fly 메서드를 제거한 후 Animal 클래스는 아래 코드와 같습니다.

이제 Flying 인터페이스를 정의하겠습니다.

이제 Dog 클래스가 변경됩니다.같이아래 코드는 플라이 동작이 필요하지 않습니다.

날아 다니는 행동을하는 Animal 하위 클래스를 살펴 보겠습니다.

우리는 이전 문제를 해결했지만 새로운 문제가 발생했습니다. 이것이 바로 '코드 복제'입니다.

100 개의 서로 다른 비행 동물 하위 클래스가 있다고 가정 해 보겠습니다. 비행 인터페이스는 비행 동작에 대한 구현을 제공 할 수 없기 때문에 비행 동작에 대한 코드를 복제해야합니다. 나중에 모든 하위 클래스에서 fly () 메서드 구현을 변경하려면 해당 클래스를 열고 코드를 변경해야합니다. 나쁘다. 우리는 큰 무언가가 부족합니다. 즉, 런타임에 클래스의 비행 동작을 변경할 수 없습니다.

하지만 걱정하지 마세요. 전략 패턴이이 문제에서 벗어날 수 있도록 도와줍니다.

이제 전략 패턴을 사용하도록 코드를 리팩터링 해 보겠습니다.

플라잉 인터페이스는 그대로 유지됩니다. 이제 플라잉 인터페이스 자체를 구현하는 각 플라잉 하위 클래스가 아니라 서로 다른 플라잉 동작을 구현할 별도의 구체적인 클래스를 정의 할 것입니다. 그 방법을 알아 보겠습니다.

어떻게 작동하는지 TestClass를 보겠습니다.

전략 패턴을 사용하여 이제 런타임에 동물의 비행 동작을 변경할 수 있습니다. 즉, 비행 동작 자체를 지정하기 위해 하위 클래스를 적용하지 않아도됩니다.

전략 패턴을 언제 사용합니까?

런타임에 동적으로 동작을 변경할 수 있기를 원할 때.

전략 패턴을 명확하게 이해하기 위해 다른 예를 들어 보겠습니다.

위의 Employee 클래스에서 우리는 그 / 그녀의 지정에 따라 직원의 급여를 설정하고 있습니다. 직원이 '인턴'인 경우 실제 급여를 계산하기 위해 기본 급여에 10 % 보너스를 추가합니다.

직원이 '웹 개발자'인 경우 기본 급여에 20 %의 보너스를 추가하여 실제 급여를 계산하고 다른 유형의 직원에 대해서도 유사한 프로세스를 따릅니다. 실제 급여를 계산하는 알고리즘은 이해하기 쉽도록 매우 간단하지만 대부분의 경우 많은 비교 및 ​​계산이 포함됩니다.

피보나치 함수 C ++

그렇다면 직원 클래스 코드에 어떤 문제가 있습니까?

음, 급여 계산 코드 (getPay ())는 정적입니다. '인턴'보너스를 10 %에서 14 %로 변경하고 싶다고 가정 해 보겠습니다. Employee 클래스 코드를 열고 변경해야합니다.

또 다른 문제는 런타임에 직원의 급여 알고리즘을 변경할 수 없다는 것입니다. 그래서 어떻게할까요? 전략 패턴은 특히 이러한 종류의 문제를 처리하는 데 사용됩니다.

전략 패턴을 사용하도록 코드를 리팩터링 해 보겠습니다.

급여를 계산하기 위해 몇 가지 알고리즘을 정의 할 것입니다. 그런 다음 이러한 알고리즘을 사용하여 런타임에 급여를 계산할 수 있습니다.

이제 Employee 클래스가 어떻게 변경되는지 살펴 보겠습니다.

노트 : Employee 클래스에서 급여 계산 논리를 제거하고 급여 계산에 사용할 PayAlgorithm을 설정하는 set PayAlgorithm () 메서드를 만들었습니다.

이렇게하면 런타임에 PayAlgorithm을 동적으로 지정하여 급여를 계산할 수있는 유연성을 얻을 수 있습니다. 또한 나중에 급여 계산 논리를 변경해야하는 경우 새 PayAlgorithm을 만들고이를 사용하여 급여를 계산할 수 있습니다. 이전 코드를 변경할 필요가 없습니다. 멋지지 않나요?

그럼 작동하는지 봅시다.

전략 패턴을 잘 이해 하셨기를 바랍니다. 무언가를 배우는 가장 좋은 방법은 연습하는 것입니다.

전략 패턴 또는 다른 패턴과 관련된 질문이있는 경우 아래에 질문을 남겨주세요.

가장 인기있는 디자인 패턴 중 하나 인 Factory Pattern을 발견 할 다음 게시물을주의하십시오.

그때까지 코드 플레이를 다운로드하고 머릿속에 전략 패턴을 확고히 할 수 있습니다.

질문이 있으십니까? 댓글 섹션에 언급하시면 다시 연락 드리겠습니다.

관련 게시물: