일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- nodejs
- 자바스크립트
- 엄티로드
- 드릴
- 주짓떼로
- 웹개발
- 개발자
- Express
- 노드
- 리액트
- graphQL
- git
- 솔로드릴
- 파이썬
- 영화리뷰
- Redux
- 영화
- 하프가드
- 디자인패턴
- 개발
- JavaScript
- web
- 클로즈가드
- 주짓수
- Node
- 영화감상
- 주짓떼라
- development
- 프로그래밍
- REACT
- Today
- Total
As i wish
[Design pattern] Strategy pattern(스트래티지 패턴, 전략패턴) 본문
안녕하세요.
오늘은 디자인패턴에 대해 포스팅을 해보려 하는데요.
일단 디자인 패턴이란 '객체 지향 프로그래밍 설계를 할 때 자주 발생하는 문제들을 피하기 위해 사용되는 패턴.' 이라고 나무 위키에 나와 있네요.
이렇듯 객체 지향 프로그래밍을 설계 하는데에 있어서 효율 적인 방법 이라는 거죠.
디자인 패턴은 공부 하면 할 수록 어렵고 심지어 적용하기는 더더욱 어려운데 계속된 반복으로 제것으로 한번 만들어 보겠습니다.
저는 보통 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 |
'Design Pattern' 카테고리의 다른 글
[Design pattern] Singleton pattern (싱글톤 패턴) (0) | 2019.03.10 |
---|---|
[Design pattern] Abstact Factory pattern (추상 팩토리 패턴) (0) | 2019.02.17 |
[Design pattern] Factory method pattern (팩토리 메소드 패턴) (0) | 2019.02.10 |
[Design pattern] Decorator pattern(데코레이터 패턴) (0) | 2019.01.27 |
[Design pattern] Observer pattern(옵저버 패턴) (0) | 2019.01.21 |