Strategy Pattern

min·2021년 11월 14일
0

과제하면서 적용 할 디자인 패턴에 대해서 생각해보자!

참고
https://victorydntmd.tistory.com/292
자바 객체지향 디자인 패턴 - 한빛 미디어

Strategy Paettern = 전략 패턴

정의 및 필요성

요즘은 안 하지만 열심히 했던 쿠키런 킹덤🍪을 예를 들어보면

엄청 많은 종류들의 쿠키들이 존재한는데 기본적으로 쿠키들은 1. 공격한다. 2. 패시브를 사용한다. 라는 공통점을 가지고 있음. 이 구조를 설계해 보자.

만약 추상 클래스를 상속 받는 형식으로 구현한다면?

만약 허브맛 쿠키의 패시브를 변경하고 싶은 경우 기존에 구현되어 있던 메서드를 수정해야 한다.

허브맛 쿠키의 공격한다라는 기능을 다크 초코맛 쿠키의 공격한다라는 기능과 동일하게 변경하는 경우(그런 일이 생길까..?) 동일한 기능을 실행하는 중복 메서드를 구현하게 된다.

새로운 신규 쿠키를 구현해야 하는 경우에 캡슐화 단위이므로 단지 쿠키 종류를 추가하는 것은 쉽지만 새로운 쿠키에 공격 및 패시브 방법을 추가하거나 변경 할 때 중복 코드가 발생 할 수 있음. 그리고 이 중복된 코드를 변경해야 하는 경우에는 모든 쿠키에게 가서 변경 해줘야 하는 번거로움이 생김.
= SOLD의 원칙 중 OCP(Open-Closed-Principle)에 위배됨. 기존의 공격 및 패시브 메소드를 변경하지 않아야 하지만 추상 클래스를 통해서 구현한 경우에는 쿠키마다 클래스에 직접 접근하여 수정이 필요함.

문제점 1. 메서드 중복성 문제 2. OCP 위배

그렇다면 어떻게?

무엇이 변화해서 문제가 일어나고 있는지 파악한다. 지금과 같은 경우에는 공격 방식 또는 패시브가 변하는 경우에 따라 문제가 일어난다는 것을 알 수 있다.

공격 방식 / 패시브에 대한 인터페이스를 각각 만들고 이를 구현한 클래스를 만든다.
유사한 행위들을 캡슐화하는 인터페이스를 정의하여 객체(=쿠키)의 행위를 동적으로 바꾸고 싶은 경우 직접 행위를 수정하지 않고 전략을 바꿔주기만 함으로써 행위를 유연하게 확장하는 방법을 의미한다.

스트래티지 패턴은 전략(=일 수행 방식, 비즈니스 규칙, 문제를 해결하는 알고리즘)을 쉽게 바꿀 수 있도록 함.

구현 방법

허브맛 쿠키: 화분을 던져서 공격 한다.
다크초코맛 쿠키: 초콜릿 맛 칼을 던져서 공격한다.

공격 방식에 대해서 Strategy 클래스를 생성한다. FlowerpotAttackStrategy, ChocolateSwordAttackStrategy 해당 클래스들은 attack() 이라는 메서드를 가진 AttackStrategy 인터페이스를 구현하도록 한다.

해당 전략을 객체(=쿠키들)에 적용시킨다.

public class Cookie {
	private AttackStrategy attackStrategy;
    
    public void attack() {
    	attackStrategy.attack()
    }
    
    public void setAttackStrategy(AttackStrategy attackStrategy) {
    	this.attackStrategy = attackStrategy;
    }
}
public class HerbCookie extends Cookie {
}

public class DarkChocoCookie extends Cookie {
}

만약에 신규 쿠키로 다크허브초코맛 쿠키가 나온다면..?
그냥 동일하게 정의 해주고 전략을 FlowerpotAttackStrategy, ChocolateSwordAttackStrategy 중 골라주거나 새로운 전략 클래스를 추가하여 주면된다.

public class DarkHerbChocoCookie extends Cookie {
}

사용 방법

public class Game {
	public void setCookies() {
    	Cookie herb = new HerbCookie();
        Cookie darkChoco = new DarkChocoCookie();
        
        herb.setAttackStrategy(new FlowerpotAttackStrategy);
        darkChoco.setAttackStrategy(new ChocolateSwordAttackStrategy);
        
        // 추후에 만약에 허브 맛 쿠키가 다크 초코 쿠키의 공격을 하게 된다면 전략만 바꿔주면 된다.
        herb.setAttackStrategy(new ChocolateSwordAttackStrategy);
        
    }
}

일단.. 디자인 패턴은 이해는 되는데 적용시키는게 어려운 것 같다

profile
발등에 불이 따뜻하다..

0개의 댓글