Strategy 패턴이란?

  • Strategy 패턴은 런타임에서 set되거나 switch될 수 있는, interchangeable한 object들의 family를 정의합니다.
  • 다음 그림과 같이 세 가지 파트로 이루어져 있습니다.

1. strategy를 사용하는 object

  • 대부분의 ios 앱 개발에서 strategy 패턴이 사용될 경우, view controller가 이러한 object입니다.
  • 하지만, interchangeable behavior가 필요하다면 모든 종류의 object들이 (기술적으로는) 이러한 object가 될 수 있습니다.

2. strategy protocol

  • Strategy protocol은 모든 strategy가 반드시 구현해야 할 메서드들을 정의하고 있습니다.

3. strategies

  • Strategystrategy 프로토콜을 준수하는 object 입니다.

언제 strategy 패턴이 사용될까?

  • 두 가지 이상의 interchangeable한 behavior를 사용해야 할 때, strategy 패턴을 사용합니다.
  • Strategy 패턴은 Delegate 패턴과 비슷합니다.
    • 둘 다 유연성(flexibility)를 높이기 위해서, protocol 기반으로 사용됩니다.
    • 결과적으로, strategy protocol을 구현한 모든 object들은 런타임에서 strategy로 사용될 수 있습니다.
  • delegation과는 다르게, strategy 패턴은 object들의 family를 사용합니다.
  • Delegate는 런타임에서 fix되어 있습니다.
    • 예를 들어 UITableViewdataSoucedelegate들은 Interface Builder에 set되어 있기 때문에, 런타임 중에 바뀌는 경우는 드문 경우입니다.
  • 하지만, strategy는 런타임 중에도 쉽게 interchangeable할 수 있도록 되어 있습니다.

Strategy 패턴을 사용할 때 주의해야 할 점

  • Strategy 패턴을 남용(overuse)하지 않도록 주의해야 합니다.
  • 특히 behavior가 바뀌지 않는 경우에는, 바로 view controller나 object context 안쪽에 넣어줘도 좋습니다.
  • 이 패턴의 trick은 behavior를 꺼내 써야할 때를 알고있다는 것입니다.
    • behavior가 필요한 곳만 정해준다면, 천천히 (behavior를) 해도 괜찮습니다.

Key Points

  • Strategy 패턴은 런타임에서 set되거나 switch될 수 있는, interchangeable한 object들의 family를 정의합니다.
  • Strategy 패턴은 strategy를 사용하는 object, strategy protocol, strategy로 나누어져 있습니다.
  • Strategy 패턴은 delegation 패턴과 비슷합니다.
    • 두 패턴 모두 유연함을 위해 protocol을 사용합니다.
    • strategy는 런타임에서도 switch될 수 있지만, delegation은 fix됩니다.

References

  • Design Patterns by Tutorials (raywenderlich)
  • Github 예제 link (commit: 847f9e4)