티스토리 뷰

CS

[디자인 패턴] Strategy Pattern

kiwiiiv 2022. 3. 22. 20:36

 

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
링크
«   2025/05   »
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
글 보관함