시그마 삽질==six 시그마

전략 패턴(Strategy Pattern) 본문

프로그래밍/디자인패턴

전략 패턴(Strategy Pattern)

Ethan Matthew Hunt 2020. 4. 24. 19:08

 

'Java 객체 지향 디자인 패턴' 책을 구입하시길  추천드립니다.

책 구입을 원하시는분은 요기를 클릭하시면 됩니다.

하단의 내용은 제가 예전에 읽었던 내용을 요약 정리한 것입니다.

 

In computer programming, the strategy pattern (also known as the policy pattern) is a behavioral software design pattern that enables selecting an algorithm at runtime. Instead of implementing a single algorithm directly, code receives run-time instructions as to which in a family of algorithms to use.

source:https://en.wikipedia.org/wiki/Strategy_pattern

 

 

 

 

스트래티지 패턴은 행동을 클래스로 분리해 캡슐화하는것으로 전략을 쉽게 바꿀 수 있게 해주는 디자인 패턴

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

 

전략: 어떤 목적을 달성하기 위해 일을 수행하는 방식, 비즈니스 규칙, 무제를 해결하는 알고리즘등

 

하단코드를 살펴보자

 

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();
}


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."); }
}

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."); }
  //public void move() { System.out.println("I can only work"); }
}

 

만약 상기 코드에서 태권V와 아톰의 기능이 추가되거나 변경되면(아톰이 날수 없고 걸을수만 있다) 태권v나 아톰의 내부 코드를 수정해서 OCP에 위배되게 된다.

애플리케이션에서 달라지는 부분을 찾아내고, 달라지지 않는 부분으로부터 분리시킴. 즉 바뀌는 부분을 따로 뽑아서 캡슐화시킨다.

하단과같이하면  새로운 기능의 추가가 기존의 코드에  영향을 미치지 못하게 되므로 OCP를 만족하게 된다.

 

public abstract class Robot {
private String name;
private AttackStrategy attackStrategy;
private MovingStrategy 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(MovingStrategy movingStrategy) {
  this.movingStrategy = movingStrategy; }
}


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



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."); }
}



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

  //전략수정 
  taekwonV.setMovingStrategy(new WalkingStrategy());
  taekwonV.setAttackStrategy(new MissileStrategy());
  atom.setMovingStrategy(new FlyingStrategy());
  atom.setAttackStrategy(new PunchStrategy());


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

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




 

Comments