디자인패턴_Strategy Pattern of Behavioral Pattern

2021. 1. 6. 11:182021/JOB DA STUDY

Strategy Pattern이란, 행위를 클래스로 캡슐화해 동적으로 행위를 자유롭게 바꿀수 있게 해주는 패턴

 즉, 같은 문제를 해결하는 여러 알고리즘이 클래스별로 캡슐화되어 있고 이들이 필요할 때 교체할 수 있도록 함으로써 동일한 문제를 다른 알고리즘으로 해결할 수 있게 하는 디자인 패턴

 

EX) 게임 캐릭터가 자신이 처한 상황에 따라 행동하는 방식을 바꾸고 싶을 때 스트래티지 패턴이 유용하다.

 

Strategy 인터페이스나 추상 클래스로 외부에서 동일한 방식으로 알고리즘을 호출하는 방법을 명시
ConcreteStrategy 스트래티지 패턴에서 명시한 알고리즘을 실제로 구현한 클래스
Context 스트래티지 패턴을 이용하는 역할을 수행 (필요에 따라 동적으로 구체적인 전략을 바꿀 수 있도록 setter메서드('집약관계')를 제공)

***집약관계***

  • 참조값을 인자로 받아 필드를 세팅하는 경우
  • 전체 객체의 라이프타임과 부분 객체의 라이프타임은 독립적이므로, 전체 객체가 메모리에서 사라져도 부분 객체는 사라지지 않는다.
로봇 만들기

 

Robot (추상_부모클래스)

public abstract class Robot{
    private String name;
    public Robot(String name) { this.name = name; }
    public String getName() { return name; }

public abstract void attack();
public abstract void move();
}

TaekwonV (상속_자식클래스1)

public class TaekwonV extends Robot{
    public TaekwonV(String name) { super(name); }
    public void attack() {System.out.println("I have Missile");}
    public void move() {System.out.println("I can only walk");}
}

Atom (상속_자식클래스2)

public class Atom extends Robot{
    public Atom(String name) { super(name); }
    public void attack() {System.out.println("I have strong punch");}
    public void move() {System.out.println("I can fly");}
}

Client (Main클래스)

public class Client{
    public static void main(String[] args){
        Robot taekwonV = new TaekwonV("TaewonV");
        Robot atom = new Atom("Atom");

        System.out.println("My name is" + taekwonV.getName());
        taekwonV.attack();
        taekwonV.move();

      System.out.println("My name is" + atom.getName());
       atom.attack();
       atom.move();
       }

 

새로운 로봇 Sungard 추가

public class Sungard extends Robot {
    public Sungard(String name) { super(name); }
    public void attack() { System.out.println("I hava Missile"); }
    public void move() { System.out.println("I can only walk");}

문제점

현재 시스템의 캡슐화 단위 = Robot이므로 로봇 추가는 쉽다. 하지만 새로 추가된 Sungard에 기존의 공격 또는 이동 방법을 추가하거나 변경하면 문제가 발생한다.

 

해결책

"무엇"이 변화했는지 찾은 후, 이를 클래스로 캡슐화

로봇의 이동방식(Move) 과 공격방식(Attack)의 변화이므로, 외부에서 공격과 이동을 위한 인터페이스를 만들고, 구체적인 이동방식과 공격방식을 담은 구체적인 클래스들을 캡슐화한다.

 

 

 

 

 

  • MovingStrategy  AttackStrategy 인터페이스에 의해 구체적인 이동과 공격 방식이 캡슐화: 일종의 방화벽 역할로 Robot 클래스의 변경을 차단

Robot Class(이동기능과 공격기능을 이용하는 Client 역할을 수행)

public abstract class Robot{
privates String name;
private AttackStrategy attackStrategy;
private Moving Strategy movingStrategy;

public Robot(String name) { this.name = name;}
public String getName() {return name;}
public void attack() {attackStrategy.attack();}
public void move() {movingStrategy.move();}

//집약관계: 전체 객체가 메모리에서 사라져도 부분 객체는 사라지지 않음
public void setAttackStrategy(AttackStrategy attackStrategy){
    this.attackStrategy = attackStrategy;}
public void setMovingStrategy(MovginhStrategy movingStrategy){
    this.movingStrategy = movingStrategy;}
}

TaekwonV/Atom Class

public class TaekwonV extends Robot{
public TaekwonV(String name) { super(name); }
}
public class Atom extends Robot{
public Atom(String name) { super(name); }
}

 

Attack/Move 기능에 대한 인터페이스/클래스(인터페이스에 의해 구체적인 이동과 공격 방식을 캡슐화)

interface AttackStrategy { public void attack(); }

public class MissileStrategy implements AttackStrategy {
    public void attack() {
         System.out.println("I have Missile");
    }
 public class PunchStrategy implements AttackStrategy {
    public void attack() {
        System.out.println("I have strong punch");
    }
}
interface MovingStrategy { public void move(); }

public class FlyingStrategy implements MovingStrategy{
    public void move() {
        System.out.println("I can fly");
    }
}
public class WalkingStrategy implements MovingStrategy{
    public void move() {
        System.out.println("I can only walk");
    }
}

 

 Client

public class Client {
public static void main(String[] args){
    Robot taekwonV = new Taekwon("TaekwonV");
    Robot atom = new atom("Atom");

taekwonV.setAttackStrategy(new MissileStrategy());
taekwonV.setMovingStrategy(new WalkingStrategy());

atom.setAttackStrategy(new PunchStrategy());
atom.setMovingStrategy(new FlyinhStrategy());

System.out.println("My name is " + taekwonV.getName());
taekwonV.move();
taekwonV.attack();

System.out.println("My name is " + atom.getName());
atom.move();
atom.attack();
}
}

'2021 > JOB DA STUDY' 카테고리의 다른 글

SSH  (0) 2021.01.11
디자인패턴_AbstractFactory Pattern of Creational Pattern  (0) 2021.01.06
디자인패턴_Singleton Pattern of Creational Pattern  (0) 2021.01.05
Final  (0) 2021.01.05
Static  (0) 2021.01.05