[디자인 패턴] 전략 패턴(Strategy Pattern)

Aug 13, 2024
[디자인 패턴] 전략 패턴(Strategy Pattern)
 

1. 전략 패턴

 
💡
전략 패턴의 핵심은 추상화이다.
전략 패턴은 추상적인 것에 의존하는 것.
 
코드를 짤 때, 구체적으로 바라보면 후에 유지 보수가 힘들어지고, 조금 바꾸는 것도 어려워진다.
하지만, 코드를 추상화 시키면 수정할 필요가 없다.
 
아래의 예시는 모자 장수의 재판을 진행하는 상황이다.
notion image
왕, 왕비를 추상화 시켜 ‘재판관’ 으로,
토끼를 ‘진행자’ 로 하고 상속,
모자 장수를 ‘증인’ 으로 추상화 하면 기존 코드를 손대지 않아도 된다. 매번 수정 할 필요가 없다.
 
다른 예시로 ‘공격을 하다 attack’ 라고 추상화 하면 어떤 공격도 가능하다.(샷건을 쏜다, 수류탄을 던진다…)
객체가 가지고 있는 attack() 메서드가 띄워질 것이니 호출만 하면 된다.
어떤 캐릭터가 나와도 캐릭터를 추상화 하면 되고, 캐릭터의 attack() 이니 동적 바인딩으로 사용 된다.
어차피 메서드는 재정의 할 거니까, 알아서 실행하기 때문.
 
아래는 내가 배운 내용으로 시도해 본 것.
package ex00; class Character { void attack() {} } class Zilot extends Character { @Override void attack() { // 동적바인딩, 오버라이드로 재정의된 메서드 System.out.println("질럿이 공격 ㄱ"); } } class Mutalisk extends Character { @Override void attack() { System.out.println("뮤탈이 공격 ㄱ"); } } class Medic extends Character { @Override void attack() { System.out.println("메딕이 공격 ㄱ"); } } public class Test { static void 기능(Character character) { // 캐릭터를 상속받고 있는 모든 캐릭터 character.attack(); // 동적바인딩, 캐릭터의 attack() } public static void main(String[] args) { Character z1 = new Zilot(); Character mu1 = new Mutalisk(); Character me1 = new Medic(); 기능(z1); // z1.attack() 이렇게 하지 않아도 됨. 기능(mu1); 기능(me1); } }
아래와 같이 잘 출력 됨^^
notion image
💡
1. 기존 코드를 손대지 않아도 된다. (If 엘리스가 온다해도 엘리스 추가만하고 상속하면됨)
  1. 구체적인 것에 의존하지 않고, 추상적인 것에 의존
재판관은 진행자와 증인에게 의존하는데, 토끼와 모자 장수에게 의존하지 않는다.
 
 

2. 객체 지향 프로그램을 짤 때, 아래의 것들을 지켜주자

 
💡
1. 객체는 상태와 행위를 가진다. 객체(상태)는 행위를 통해서만 변경한다. 2. 객체 지향 설계 원칙 SOLID 원칙을 지킨다.
 

2-1.

SOLID 중 D(의존 역전 원칙(Dependency Inversion Principle, DIP))
변화하지 않는 것에 의존하라 추상적인 것에 의존하라는 것이다.
 
static void 레이싱(Car car) { car.run(); }
Car 에 의존하지, Sonata 에 의존하는 것이 아니다.
추상적인 것에 의존하는 것이 좋습니다..
 

2-2.

SOLID 중 O(개방-폐쇄 원칙(Open-Closed Principle, OCP))
기존 코드에 손대지 마라, 하지만 새로운 걸 만드는 것은 환영한다는 것이다.
확장에는 열려있고, 수정에는 닫혀있다.
 
타입검사인 instanceof 를 사용하는 것은 OCP 를 못 지키는 것임
static void 레이싱(Car car) { if(car instanceof Sonata) { System.out.println("소나타 달린다~~~"); } else if(car instanceof Genesis) { System.out.println("제네시스 달린다~~~"); } // ... else if 로 계속 추가하게 되니 수정이 불가피 }
 

2-3.

SOLID 중 S(단일 책임 원칙(Single Responsibility Principle, SRP))
클래스는 하나의 책임을 가진다는 것이다.
엔진은 엔진의 역할만 가지면 된다.
쪼개지 않으면 경우의 수 테스트가 복잡해진다.
차후에 뭐가 문제인지 디버깅 하기도 힘듬.
명확하게 분리하려면, 책임을 분리 시켜야함
 

3. 기타

 

참고 링크

아래는 참고 링크 본문 중 일부를 발췌 해 온 것이다.
 
notion image
 
위의 말은 ‘뭐든 넣을 수 있다’ 는 것을 의미한다.
 
패턴을 공부하는 첫 번째 목적은 어떤 디자인이 있는지 체킹 하는 것이다.
패턴을 알면 코드를 보자마자 어떤 패턴으로 만들어졌는지 알 수 있게 된다.
내가 이 패턴으로 코드를 직접 짜는 게 목적이 아니라, 남이 만든 걸 보고 모방 할 수 있어야 하고, 거기서 응용하는 것.
그러니 지금은 구현을 못했다고 좌절하지 마시라..! 는 강사님의 따뜻한 말씀 감사합니다.
 
 
Share article

eunmouse