디자인패턴_Strategy Pattern of Behavioral Pattern
2021. 1. 6. 11:18ㆍ2021/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 |