🌻 JAVA/디자인 패턴

1. 스트래티지(Strategy) 패턴 - Head First Design Patterns

2020. 4. 4. 11:56
반응형

 

* 상속을 잘 활용하면 재사용 할수 있지만, 실제 코드를 정비 하는데는 별 도움이 되지 않는다.

 

일단 잘못된 예를 먼저 보자.

이런 식으로 코드를 구현하면 , 나중에 행동을 추가한다던지, 다른 오리를 추가 할때 문제가 발생한다.

코드를 재사용하는 점에서도 좋지 않고, 나중에 날아다니는, 꽥꽥 거리는 행동을 바꿀때, 모든 코드를 다 바꿔야하는 상황을 초래한다. 

 

 

디자인 원칙 ) 애플리케이션에서 달라지는 부분을 찾아내고, 달라지지 않는 부분으로부터 분리시킨다.

 

 

그렇다면, Duck클래스에서는 ?

나는 행동과 꽥꽥 거리는 행동을 분리 시킨다.

 

디자인 원칙 ) 구현이 아닌 인터페이스에 맞춰서 프로그래밍 한다.

 

Cat에는 "냐옹" , Dog에는 "월월"

 


  • 이런식으로 디자인 하면 다른 형식 개체에서도 나는 행동과 꽥꽥 행동을 재사용 할수 있다. (코드의 재사용)
  • 그리고, 기존의 행동 클래스를 수정하거나 날아다니는 행동을 사용하는 Duck 클래스를 전혀 건드리지 않고도 새로운 행동을 추가 할수 있다.

*여기서 중요한 점은 quack() , fly() 를 클래스에 알맞게 실행 시킬수 있어야 한다.

 

만약 RubberDuck(장난감 고무오리) 는? - (날수 없다, 삑 소리를 낸다.)

//RubberDuck.java 중 생성자 부분.

public RubberDuck(){
	flyBehavior = new FlyNoWay();
     quackBehavior = new Squeak();
}

이런 식으로 각 오리의 특징에 맞게 생성자에서 초기화를 시켜줘야한다.

하지만, 실행중에 동적으로 행동을 지정할수는 없다.

그러려면 어떻게 해야하는가??

 

//Duck.java

public void setFlyBehavior( FlyBehavior fb ){
	flyBehavior = fb;
}

public void setQuackBehavior( QuackBehavior qb){
	quackBehavior = qb;
}

실행중에 동적으로 행동 지정하기. setter 메소드 사용!

아래는 main문에서 행동을 지정해주는 코드이다.

 

// main

Duck rubber = new RubberDuck(); // 못날음, 삑 소리를 냄

rubber.performFly();
rubber.setFlyBehavior( new RocketPowered() ); // 못나는 오리에게 로켓을 달아주었다.
rubber.performFly();

 출력)  저는 못날아요.

         로켓 추진으로 날아갑니다!

 


디자인 원칙 ) 상속보다는 구성을 활용한다.

 

 

아래는 전체 클래스 다이어 그램이다. 실행중에 동적으로 행동이 변경가능하고, 추후에 새로운 오리를 추가하거나, 행동을 변경할때 간단하게 코드 변경을 통해 행동을 바꿀수 있다.

 

 

 

  스트래티지 패턴(Strategy Pattern) 에서는 알고리즘군을 정의하고 각각을 캡슐화하여 교환해서 사용할 수 있도록 만든다. 스트래티지 를 잘 활용하면 알고리즘을 사용하는 클라이언트와는 독립적으로 알고리즘을 변경할 수 있다.

 

반응형
저작자표시 (새창열림)
'🌻 JAVA/디자인 패턴' 카테고리의 다른 글
  • 5. 싱글턴 (Singleton) 패턴 - Head First Design Patterns
  • 4. 팩토리(Factory) 패턴 - Head First Design Patterns
  • 3. 데코레이터(Decorator) 패턴 - Head First Design Patterns
  • 2. 옵저버(Observer) 패턴 - Head First Design Patterns
iseunghan
iseunghan
꾸준하게 열심히..
iseunghan꾸준하게 열심히..
iseunghan
iseunghan

공지사항

  • 어제보다 나은 오늘이 되기 위해 🔥
  • 분류 전체보기 (262)
    • 💐 Spring (14)
      • 개념 및 이해 (2)
      • Spring 핵심 기술 (24)
      • Spring REST API (8)
      • Spring MVC, DB 접근 기술 (7)
      • Spring Security (23)
      • Spring in Action (1)
    • 🌻 JAVA (84)
      • 자바 ORM 표준 JPA 프로그래밍 (20)
      • 알고리즘, 자료구조 (13)
      • 디자인 패턴 (7)
      • 정리정리정리 (43)
      • JUnit (1)
    • 🔖 Snippets (3)
      • Javascript (3)
    • ⚙️ Devops (22)
      • ⛏ Git (11)
      • 🐳 Docker (6)
      • 🐧 Linux (3)
      • 🌈 Jenkins (1)
      • 📬 Kafka (1)
    • 💬 ETC.. (4)
      • 💻 macOS (2)
    • 🌧️ ORM (2)
      • JPA (2)
    • 🐍 Python (3)
    • 📚 Databases (15)
      • 오라클로 배우는 데이터베이스 개론과 실습(2판) (3)
      • RealMySQL 8.0 (8)
    • 🔥 Computer Science (5)
      • 📡 네트워크 (5)
    • 🏷️ 협업 (1)
    • 📜 코딩테스트 (38)
      • BAEKJOON\수학 1, 수학 2 (8)
      • BAEKJOON\재귀 (5)
      • BAEKJOON\브루트 포스 (3)
      • BAEKJOON\정렬 (1)
      • BAEKJOON\백트래킹 (5)
      • BAEKJOON\BFS, DFS (6)
      • BAEKJOON\이분탐색 (1)
      • BAEKJOON\다이나믹 프로그래밍 (9)
      • BAEKJOON\그리디 알고리즘 (0)
    • ✨ ISEUNGHAN (1)

인기 글

최근 글

전체
오늘
어제
반응형
hELLO · Designed By 정상우.
iseunghan
1. 스트래티지(Strategy) 패턴 - Head First Design Patterns
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.