하고재비

Strategy Pattern 스트래지 패턴 본문

Design Pattern

Strategy Pattern 스트래지 패턴

DeadDE 2020. 9. 10. 23:34

스트레지 패턴은 전략을 쉽게 바꿔주기 위한 패턴.

여러 알고리즘이 클래스 별로 캡슐화 되어있고, 이들이 필요할때 교체할수 있도록 함..

 

스트래지 패턴

1) StrategySort - 인터페이스. 추상클래스 - 외부에서 동일한 방식으로 알고리즘을 호출하는 방법을 명시

2) quickSort, selectSort, bubbleSort - 위에서 명시한 알고리즘 구현부

3) sort() - 패턴을 이용하는 역할

 

 

로봇이라는 추상클래스를 이용하여 아톰과 태권브이라는 자식클래스를 설정.

설계의 이유는 아톰과 태권브이 둘 다 공격과 이동 기능이 있는 로봇의 한 종류이기 때문이다. 하지만

아톰과 태권브이의 이동과 공격의 형태가 다르기 때문에 Robot 클래스에서 이 둘을 추상메서드로 설정하여 

자식클래스에서 각각 정의하도록 구현. 

 

package Strategy;

 

public abstract class Robot {

 

    private String name;

    

    public Robot(String name){

        this.name = name;

    }

    

    

    

    public String getName() {

        return name;

    }

 

 

 

    public void setName(String name) {

        this.name = name;

    }

 

 

 

    public abstract void move();

    public abstract void attack();

    

}

 

package Strategy;

 

public class Atom extends Robot{

 

    public Atom(String name) {

        super(name);

        // TODO Auto-generated constructor stub

    }

 

    @Override

    public void move() {

        // TODO Auto-generated method stub

        System.out.println(this.getName() + " : Move can Fly!");

    }

 

    @Override

    public void attack() {

        // TODO Auto-generated method stub

        System.out.println(this.getName() + " : Attack Atom Missile!");

    }

 

}

 

package Strategy;

 

public class TaeckwonV extends Robot{

 

    public TaeckwonV(String name) {

        // TODO Auto-generated constructor stub

        super(name);

    }

    @Override

    public void move() {

        // TODO Auto-generated method stub

        System.out.println(this.getName() + " : TaekwonV Move only work!");

    }

 

    @Override

    public void attack() {

        // TODO Auto-generated method stub

        System.out.println(this.getName() + " : Attack Tackwon YAP!");

    }

 

}

 

package Strategy;

 

public class Client {

 

    public static void main(String[] args) {

        // TODO Auto-generated method stub

        

        Atom at = new Atom("Atom");

        TaeckwonV tw = new TaeckwonV("Taekwon");

        Atom at2 = new Atom("ggg");

        

        System.out.println("intro");

        System.out.println(at.getName());

        System.out.println(tw.getName());

        

        System.out.println("Move");

        

        at2.move();

        tw.move();

        

        System.out.println("Attack");

        

        at.attack();

        tw.attack();

    }

 

}

Colored by Color Scripter


cs

 

이렇게 구현되어 있는 코드에 

1) 아톰의 이동방법을 걷기로 변경할때

    - 아톰의 이동 메서드를 직접 코딩해야하는데... 이런경우가 잦아지면 똥망함.  

2) 새로운 로봇을 만들거나, 기존의 이동 공격방법을 추가하거나 수정할려면?

    - 새로운 로봇 추가는 쉽지만 기존의 이동 공격 방법을 하나하나 업데이트 할려면 위험부담이 크다.

 

즉, 새로운 로봇이든 기존의 로봇들이든 코드변경없이 기능에 대한 제공이 되거나, 기존의 기능들을 손쉽게 변경가능 해야 한다. 

 

해결책은 1. 어떤변화가 있는지 파악하고, 2. 변화되는 클래스로 캡슐화 해야한다.

구체적인 움직임과 공격에 대한 클래스를 만들고, 은닉한다.

이를위해 움직임과 공격의 인터페이스를 만들고, 이들을 실제 실현한 클래스를 만들어야 한다. 

 

 

각 기능별 interface(캡슐화) 및 기능실행 class 생성

 

package Strategy;

 

public interface Attack {

    public void attack();

    public void talk();

}

 

package Strategy;

 

public interface Moving {

    public void moving();

}

 

package Strategy;

 

public class AttackMissile implements Attack{

 

    @Override

    public void attack() {

        // TODO Auto-generated method stub

        System.out.println("Attack Missile");

    }

 

    @Override

    public void talk() {

        // TODO Auto-generated method stub

        System.out.println("미사일 발사");

    }

 

}

 

package Strategy;

 

public class AttackPunch implements Attack{

 

    @Override

    public void attack() {

        // TODO Auto-generated method stub

        System.out.println("Attack punch");

    }

 

    @Override

    public void talk() {

        // TODO Auto-generated method stub

        System.out.println("냥냥 펀치!");

    }

 

}

 

package Strategy;

 

public class MoveFly implements Moving{

 

    @Override

    public void moving() {

        // TODO Auto-generated method stub

        System.out.println("flying");

    }

 

}

 

 

package Strategy;

 

public class MoveWalk implements Moving{

 

    @Override

    public void moving() {

        // TODO Auto-generated method stub

        System.out.println("walking");

    }

 

}

 

 

Colored by Color Scripter


cs

 

로봇 추상클래스 수정(추상 메서드 삭제, 움직임과 공격의 정의)

package Strategy;

 

public abstract class Robot {

 

    private String name;

    private Moving interface_move;

    private Attack interface_attack;

    

    public Robot(String name){

        this.name = name;

    }

    

    public String getName() {

        return name;

    }

 

    public void setName(String name) {

        this.name = name;

    }

    

    public void setMoving(Moving moving){

        this.interface_move = moving;

    }

    

    public void move(){

        interface_move.moving();

    }

    

    public void setAttacking(Attack attack){

        this.interface_attack = attack;

    }

    

    public void attack(){

        interface_attack.attack();

    }

    

    public void talk(){

        interface_attack.talk();

    }

 

}

 

Colored by Color Scripter


cs

 

 

Comments