Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- findTopBy
- ksql
- multipart테스트
- 리팩토링 2판
- 마이크로 서비스
- 백명석님
- aws
- Linux
- intellij favorites
- java
- JPA
- ksqldb
- IntelliJ
- git
- javascript case
- intellij 즐겨찾기
- Stream
- HandlerMethodArgumentResolver
- Spring Cloud Netflix
- 리눅스
- @TransactionalEventListener
- 원격 브랜 삭제
- CompletableFuture
- 친절한 SQL 튜닝
- 자바 ORM 표준 JPA 프로그래밍
- #docker compose
- vue.js
- @Transactional Propagation
- 자바 ORM 표준 JPA 프로그래밍 정리
- intellij 핵심 단축키
Archives
- Today
- Total
시그마 삽질==six 시그마
전략 패턴(Strategy Pattern) 본문
'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();
}
}
'프로그래밍 > 디자인패턴' 카테고리의 다른 글
데코레이터 패턴(Decorator pattern) (0) | 2020.04.24 |
---|---|
스테이트 패턴(State pattern) (0) | 2020.04.24 |
싱글톤 패턴(Singleton Pattern) (0) | 2020.04.23 |
템플릿 메서드 패턴 & 팩토리 메서드 패턴 (0) | 2020.04.23 |
빌더 패턴(Builder pattern) (0) | 2020.04.23 |
Comments