티스토리 뷰
Strategy(전략)를 캡슐화하여 동적으로 자유로이 바꿀 수 있게 하는 패턴
-->Strategy : 어떤 일을 수행하는 방식, 알고리즘 등
=> 같은 문제를 해결하는 다양한 알고리즘(Strategy)을 클래스별로 캡슐화하고,
이들이 필요에 의해 교체될 수 있게 하여
동일한 문제를 다른 알고리즘으로 해결할 수 있게 하는 디자인 패턴
OCP(Open-closed Principle)
: 확장에 대해서는 Open, 수정에 대하여는 Close
Strategy 패턴을 사용하지 않을 때
-> 동적으로 행위의 수정이 불가능.
-->새로운 기능으로의 변경을 위하여 기존의 코드를 수정해야 함.
---> OCP 원칙에 위배
Strategy : 인터페이스, 혹은 추상 클래스. 알고리즘을 호출하는 추상 메소드(strategyMethod)를 명시함
ConcreteStrategy : Strategy Interface에서 명시한 알고리즘 메소드를 실제로 구현한 클래스들
Context : 필요에 따라 알고리즘 방식을 동적으로 주입받아 사용할 수 있음
예시))
//Robot
//Context
public class Robot {
//-strategy
private MoveStrategy moveStrategy;
//주입받은 strategy를 이용
public void move() {
moveStrategy.move();
}
//strategy 주입
public void setMoveStrategy(MoveStrategy moveStrategy) {
this.moveStrategy = moveStrategy;
}
}
Strategy
public interface MoveStrategy {
public void move();
}
public class FlyStrategy implements MoveStrategy {
@Override
public void move() {
System.out.println("Flying..");
}
}
public class WalkStrategy implements MoveStrategy {
@Override
public void move() {
System.out.println("Walking..");
}
}
public class SwimStrategy implements MoveStrategy {
@Override
public void move() {
System.out.println("Swimming..");
}
}
Main
public class Main {
public static void main(String[] args) {
System.out.println("--Strategy Pattern");
Robot robot = new Robot();
//fly
robot.setMoveStrategy(new FlyStrategy());
robot.move();
//swim
robot.setMoveStrategy(new SwimStrategy());
robot.move();
//walk
robot.setMoveStrategy(new WalkStrategy());
robot.move();
}
}
IF) 새로운 MoveStrategy가 추가된다면,
public class RunStrategy implements MoveStrategy{
@Override
public void move(){
System.out.println("Running..");
}
}
> 새로운 기능의 추가가 기존의 코드에 영향을 끼치지 않음(수정할 필요가 없음)
>> OCP 원칙을 만족
더보기
++
2022.03.26 - [JAVA] - [디자인 패턴] Template Method pattern
와의 비교(비슷한 다이어그램의 모양을 가짐..)
알고리즘은 부모 클래스에서 정의되고, 자식 클래스에서는 세부사항을 변경
>> 기능의 확장을 중심으로 함(상위에서 구현하지 못한 부분을 구현)
>>> Template method는 부모 클래스에서 정의된 것에 자식 클래스에서 추가시키는 것이기 때문에 부모 클래스에 의존되는 특징을 가짐
유연성에 있어서 strategy가더높음
상위 클래스에서 하위 클래스가 오버라이딩한 메소드를 호출함.(의존의 역전)
'CS' 카테고리의 다른 글
Index (0) | 2022.04.14 |
---|---|
[OS] 교착 상태(Deadlock) (0) | 2022.04.05 |
[디자인 패턴] Proxy Pattern (0) | 2022.04.03 |
OSI 7계층 (0) | 2022.03.31 |
[디자인 패턴] Template Method pattern (0) | 2022.03.26 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- HashSet
- Sort
- 참조 지역성
- RequiredArgsConstructor
- MaxHeap
- Knapsack
- 분할 정복
- dp
- 희소 배열
- 이분탐색
- 배낭 문제
- 완전탐색
- dfs
- Priority Queue
- 구간 합
- 페르마의 정리
- MinHeap
- 최단 거리
- Greedy
- 비트마스킹
- 누적 합
- 완전 탐색
- 분할정복
- 위상 정렬
- 부분 합
- prirotyqueue
- 백트래킹
- 동적계획법
- Segment Tree
- LowerBound
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함