As i wish

[Design pattern] Strategy pattern(스트래티지 패턴, 전략패턴) 본문

Design Pattern

[Design pattern] Strategy pattern(스트래티지 패턴, 전략패턴)

어면태 2019. 1. 14. 15:16

안녕하세요.

오늘은 디자인패턴에 대해 포스팅을 해보려 하는데요.

일단 디자인 패턴이란 '객체 지향 프로그래밍 설계를 할 때 자주 발생하는 문제들을 피하기 위해 사용되는 패턴.' 이라고 나무 위키에 나와 있네요.

이렇듯 객체 지향 프로그래밍을 설계 하는데에 있어서 효율 적인 방법 이라는 거죠.

디자인 패턴은 공부 하면 할 수록 어렵고 심지어 적용하기는 더더욱 어려운데 계속된 반복으로 제것으로 한번 만들어 보겠습니다.


저는 보통 Headfirst Designpattern 이란 책을 참고해서 포스팅 해보려고요

그럼 처음으로 하는 디자인패턴 그 중에 전략 패턴이라고도 불리는 스트레티지 패턴에 대해 공부해 보겠습니다.


먼저 정의 부터 알아보도록 하죠.


스트래티지 패턴

알고리즘군을 정의하고 각각 캡슐화하여 교환해서 사용할 수 있도록 만든다.

스트래티지패턴을 활용하면 알고리즘을 사용하는 클라이언트와는 독립적으로 알고리즘을 변경할 수 있다.


달라지는 부분을 따로 캡슐화 해서 각각에 맞게 독립적으로 정의 할 수 있어야 한다. 라고 쉽게 생각하면 되겠네요.


먼저 클래스 다이어그램으로 확인해 보겠습니다.




Duck 이라는 클래스에서는 MallardDuck, RubberDuck, RedHeadDuck 등의 인스턴스들이 나올 수 있습니다.

그러나 각각 오리들은 날으는 행동(FlyBhavior)과 소리 행동(QuackBehavior)이 다 다르죠.

그렇기 때문에 각각의 날으는 행동(FlyBhavior)과 소리 행동(QuackBehavior)들을 상속받아서 구현하지 않고 따로 때어 내서 캡슐화 시켜서 해주면 편하게 관리 할 수가 있죠.


더욱 쉽게 코드로 확인해 보겠습니다.

책에서는 보통 자바로 코드를 구현 했었는데 저는 Python을 통해 구현해 보겠습니다.

 

1
2
 3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# -*- coding: utf-8 -*-
# Strategy Pattern
 
import abc
 
class Duck:
  __metaclass__ = abc.ABCMeta
 
  @abc.abstractmethod
  def display(self):
    pass
 
  def performFly(self):
    self.fly_behavior.fly()
 
  def performQuack(self):
    self.quack_behavior.quack()
 
class MallardDuck(Duck):
  def __init__ (self):
    self.fly_behavior = FlyNoway()
    self.quack_behavior = Quack()
 
  def display(self):
    print("Mallard duck")
 
class RubberDuck(Duck):
  def __init__ (self):
    self.fly_behavior = FlyWithWings()
    self.quack_behavior = Quack()
 
  def display(self):
    print("Rubber duck")
 
class RedHeadDuck(Duck):
  def __init__ (self):
    self.fly_behavior = FlyWithWings()
    self.quack_behavior = MuteQuack()
 
  def display(self):
    print("Red head duck")
 
class FlyBehavior:
  __metaclass__ = abc.ABCMeta
 
  @abc.abstractmethod
  def fly(self):
    pass
 
class FlyWithWings(FlyBehavior):
  def fly(self):
    print("Fly with wings")
 
class FlyNoway(FlyBehavior):
  def fly(self):
    print("Fly no way")
 
class QuackBehavior:
  __metaclass__ = abc.ABCMeta
 
  @abc.abstractmethod
  def quack(self):
    pass
 
class Quack(QuackBehavior):
  def quack(self):
    print("Quack Quack")
 
class MuteQuack(QuackBehavior):
  def quack(self):
    print ("Mute...")
 
 
mallad_duck = MallardDuck()
rubber_duck = RubberDuck()
redhead_duck = RedHeadDuck()
 
print("### MALLAD DUCK ###")
mallad_duck.display()
mallad_duck.performFly()
mallad_duck.performQuack()
print("### RUBBER DUCK ###")
rubber_duck.display()
rubber_duck.performFly()
rubber_duck.performQuack()
print("### REDHEAD DUCK ###")
redhead_duck.display()
redhead_duck.performFly()
redhead_duck.performQuack()
 
 
cs



위 처럼 각각 필요한 나는 행동, 우는 행동을 각각에 오리들의 맞게 전략적으로 셋팅 해주면서
나는 행동가 우는 행동을 독립적으로 관리하고 그로 인해 각기 다른 오리들의 객체가 나오는것을 확인 할 수 있죠.
이에 따라 나는 행동을 더 추가 할 수 있고, 부모 클래스를 건들지 않아도 수정 할 수가 있게 되죠.

부족한 부분이나 틀린 부분 있으면 댓글로 달아주세요~





Comments