전략 디자인 패턴에 대해 이야기합시다!
이 디자인 패턴은 메소드 내부의 주요 알고리즘을 변경하는 데 도움이 됩니다.
클래스에 하드코딩하는 대신 이 알고리즘을 구현하는 클래스를 전달하면 됩니다.
그리고 내가 알고리즘이라고 하면 멋진 컴퓨터 과학 알고리즘이 아니라 결과를 얻기 위해 일련의 단계를 따르는 모든 코드를 의미합니다.
전략 패턴을 사용하는 경우
이 패턴이 정확히 어떤 문제를 풀고 있습니까?
개방/폐쇄 원리 문제.
이 원칙은 다음과 같이 말합니다.
<블록 인용>"소프트웨어 엔터티(클래스, 모듈, 메서드)는 확장을 위해 열리고 수정을 위해 닫혀야 합니다."
이것은 클래스가 새로운 일을 하도록 만들기 위해 클래스 자체를 변경할 필요가 없다는 것을 의미합니다. 이렇게 하면 코드가 더 유연하고 강력해집니다.
하지만 어떻게 합니까?
전략 패턴과 같은 디자인 패턴 사용 🙂
ReportGenerator
가 있다고 가정해 보겠습니다. 같은 데이터를 사용하여 다양한 종류의 보고서 형식을 생성하려고 합니다.
각 보고서 유형에 대한 메소드를 작성할 수 있지만, 이는 새 유형을 추가하고 싶을 때마다 클래스를 변경해야(새 메소드를 추가하여)해야 하므로 열기/닫기 원칙을 깨야 합니다.
아니면 더 나빠요!
모든 종류의 if 문과 함께 하나의 HUGE 메서드를 가질 수 있습니다... 이것들은 종종 잘 끝나지 않습니다.
하지만 학급에서 보고서 형식을 지정하는 방법을 알 필요가 없다면 어떻게 될까요?
알고리즘이 클래스 외부에서 온 경우 ?
그러면 클래스 자체를 변경하지 않고 언제든지 형식 지정 알고리즘을 변경할 수 있습니다.
이렇게 하면 문제가 해결됩니다.
이것이 바로 전략 패턴입니다. 모든 것입니다.
전략 패턴 예시
전략은 하나의 메소드로 클래스 형태로 구현됩니다.
다음은 ReportGenerator
에 대한 몇 가지 형식 지정 전략입니다. 클래스:
require 'json' module ReportFormatters class JSON def self.format(data) data.to_json end end class PlainText def self.format(data) data.to_s end end class HTML def self.format(data) html = "" html << "
- "
data.each { |product, amount| html << "
- #{product}: #{amount} " } html << "
모든 전략이 format
을 구현하는 방법에 주목하세요. 방법. 이 메소드는 보고서 생성기 클래스에 의해 호출됩니다.
코드는 다음과 같습니다. :
class ReportGenerator def self.generate(data, formatter) formatter.format(data) end end data = { onions: 31, potatoes: 24, eggs: 10 } p ReportGenerator.generate(data, ReportFormatters::HTML) p ReportGenerator.generate(data, ReportFormatters::JSON) p ReportGenerator.generate(data, ReportFormatters::PlainText)
지금:
출력 형식을 변경하려는 경우(HTML
에서 PlainText
로 ) 다른 전략을 전달해야 하며 전략이 format
을 구현하는 한 작동합니다. 방법.
이 패턴에 대해 생각하는 또 다른 방법은 특정 비즈니스 전략을 전문으로 하는 컨설턴트를 고용하면 컨설턴트가 와서 전략을 구현한다는 것입니다. 당신을 위해, 이 전략은 특정한 결과를 산출할 것입니다.
이에 반해 데코레이터 패턴과 같은 패턴은 크리스마스 트리에 새로운 장식품을 추가하여 더욱 화려하게 만드는 것과 같습니다.
한 번에 하나의 전략으로만 작업할 수 있지만 원하는 만큼 장신구를 가질 수 있습니다.
동영상
요약
전략 디자인 패턴에 대해 배웠습니다. 클래스 자체를 변경하지 않고 클래스가 수행하는 작업의 일부를 변경해야 할 때 사용하세요.
읽어주셔서 감사합니다!
이 게시물을 공유하는 것을 잊지 마세요. Twitter에서 재미있다 , 더 많은 사람들이 즐길 수 있도록 도와드리겠습니다 🙂