전략 패턴(디자인 패턴의 핵심)

윤주헌's avatar
Aug 13, 2024
전략 패턴(디자인 패턴의 핵심)
💡
핵심은 추상화다
 
💡
전략 패턴이란? 알고리즘들의 패밀리를 정의하고, 각 패밀리를 별도의 클래스에 넣은 후 그들의 객체들을 상호교환할 수 있도록 하는 행동 디자인 패턴입니다.
 
공부하기 좋은 곳
 
이상한 나라 엘리스에서 모자장수가 누가 과일 파이들을 훔쳤나?
구체적으로 하면 바꾸기 힘들다

1. Ex

  1. 왕이 토끼에게 “모자장수는 들라하라” 라고 한다
  1. 토끼는 “모자장수는 들어와라” 라고 한다
  1. 토끼는 “모자장수는 증언하라” 라고 한다
  1. 모자장수가 증언을 한다
만약 왕이 왕비로 바뀌고 모자장수가 엘리스로 바뀐다면 다 변해야 한다

1.1 Ex 추상화 한 것(좋음)

  1. 재판관은 “진행자야 증인을 들라하라” 라고 한다
  1. 진행자는 “증인은 들어와라” 라고 한다.
  1. 진행자는 “증인은 증언하라” 라고 한다.
  1. 증인이 증언을 한다.
→ 기존 코드를 손대지 않아도 된다. new엘리스 하고 증인을 상속하면 된다.
→ 구체적인 것에 의존하지 않고, 추상적인 것에 의존(재판관은 토끼와 모자장수에 의존하지 않는다)
 

2. dip가 전략패턴이다

O(ocp) → 개방폐쇠의 원칙 : 기존코드 손대지 말고 새로운 것에는 열려있어라 D(dip)(Dependency Inversion Principle) → 의존성 역전 원칙 ( 추상적인것에 의존해라(구체적인 것에 의존하지 말고)) 왜 쓰는지는 다른 이유 S(SRP) → 단일 책임의 원칙(엔진은 엔진의 원칙만 가지면 된다. ) 여러가지 가 같이 있으면 무엇이 문제인지 확인이 어렵기 때문에 확인하기 위해 (클래스는 최소한의 원칙으로 만든다) LI는 중요하지 않음
 

3. 예시

3.1 동물이면 쫓아 내는 코드를 만들어라

기존 코드
public class App { public static void main(String[] args) { Mouse m1 = new Mouse(); Tiger t1 = new Tiger(); Doorman d1 = new Doorman(); d1.쫓아내(t1); d1.쫓아내(m1); } } public class Doorman { //책임줄거다 쥐 출입금지 public void 쫓아내(Mouse a){ System.out.println(a.getName()+"쫓아내"); } } public class Mouse{ private String name = "쥐"; public String getName() { return name; } } public class Tiger{ private String name = "호랑이"; public String getName() { return name; } }

3.2 타입 일치(다형성), abstract

public class App { public static void main(String[] args) { Mouse m1 = new Mouse(); Tiger t1 = new Tiger(); Doorman d1 = new Doorman(); d1.쫓아내(t1); d1.쫓아내(m1); } } public class Doorman { //책임줄거다 쥐 출입금지 public void 쫓아내(Animal a){ System.out.println(a.getName()+ "쫓아내"); } } abstract class Animal { abstract String getName(); } public class Mouse extends Animal { private String name = "쥐"; public String getName() { return name; } } public class Tiger extends Animal { private String name = "호랑이"; public String getName() { return name; } }

4. 그림 설명

notion image
Share article

code-sudal