πŸ“– [λ””μžμΈνŒ¨ν„΄] πŸ’» Strategy Pattern (μ „λž΅μ  νŒ¨ν„΄)

πŸ’» Strategy Pattern (μ „λž΅μ  νŒ¨ν„΄)

μ•ˆλ…•ν•˜μ„Έμš”. πŸ‘‹

μ˜€λŠ˜μ€ Strategy Pattern ( μ „λž΅μ  νŒ¨ν„΄ ) 에 λŒ€ν•΄

μ•Œμ•„λ³΄λ €κ³  ν•©λ‹ˆλ‹€.

What is Strategy Pattern? (μ „λž΅μ  νŒ¨ν„΄μ΄λž€?)

  • Strategy Pattern μ΄λž€ ν–‰μœ„λ₯Ό 클래슀둜 μΊ‘μŠν™”ν•΄ λ™μ μœΌλ‘œ! ν–‰μœ„λ₯Ό 자유둭게 λ°”κΏ€ 수 있게 ν•΄μ£ΌλŠ” λ””μžμΈ νŒ¨ν„΄μž…λ‹ˆλ‹€. 상황에 맞게 끔 μ „λž΅(μ •μ±…)에 맞게 끔 ν–‰μœ„λ₯Ό μ§€μ •ν•΄μ€λ‹ˆλ‹€.

μ˜ˆμ‹œ

μ—¬λŸ¬ μ „νˆ¬κΈ°κ°€ μžˆλ‹€κ³  가정을 ν–ˆμ„ λ•Œ μ „νˆ¬κΈ°λŠ” κ³΅ν†΅μ μœΌλ‘œ 곡격을 ν•  무기가 μžˆμŠ΅λ‹ˆλ‹€.

ν•˜μ§€λ§Œ μ „νˆ¬κΈ°μ˜ μ’…λ₯˜μ— 따라 각각 λ¬΄κΈ°λŠ” λ‹€λ¦…λ‹ˆλ‹€.

λ˜ν•œ 상황에 따라 무기가 λ‹¬λΌμ§ˆ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

μ΄λŸ΄λ•Œ μ „νˆ¬κΈ°μ˜ 곡톡적인 ν–‰μœ„μ— λŒ€ν•΄ 각각 상황에 맞게 μ „λž΅μ— 맞게 μ •ν•΄μ£ΌλŠ” 것이 μ „λž΅μ  νŒ¨ν„΄μž…λ‹ˆλ‹€.

μ „λž΅μ  νŒ¨ν„΄μ˜ μ‚¬μš© 이유

μ „νˆ¬κΈ° 좔상 클래슀

package strategy;

public abstract class Fighter implements AttackStrategy{
    private String name;

    public Fighter(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


}

F2 μ „νˆ¬κΈ°

package strategy;

public class F2 extends Fighter{
    public F2(String name) {
        super(name);
    }

    @Override
    public void attack() {
        System.out.println("λ―Έμ‚¬μΌλ‘œ 곡격");
    }
}

μ „λž΅μ  νŒ¨ν„΄μ˜ μ‚¬μš©μ΄μœ λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€. μœ„μ²˜λŸΌ 상속을 μ΄μš©ν•œλ‹€λ©΄ κΈ°λŠ₯을 μΆ”κ°€ν•˜κ±°λ‚˜ λ³€κ²½ν•˜λ €λ©΄ 기쑴의 μ½”λ“œλ₯Ό λ³€κ²½ν•΄μ•Ό ν•©λ‹ˆλ‹€. μ΄λŠ” OCP(Open-Closed Principle) 법칙에 μœ„λ°°λ©λ‹ˆλ‹€.

λ˜ν•œ 이런 방식은 μ‹œμŠ€ν…œμ΄ ν™•μž₯이 λ˜μ—ˆμ„ λ•Œ μœ μ§€λ³΄μˆ˜λ₯Ό νž˜λ“€κ²Œ ν•©λ‹ˆλ‹€. 예λ₯Όλ“€μ–΄ F2 μ˜μ™Έμ— λ‹€λ₯Έ μ—¬λŸ¬ μ’…λ₯˜μ˜ μ „νˆ¬κΈ°λ“€μ΄ 생겨날 λ•Œ μƒˆλ‘œμš΄ μ’…λ₯˜μ˜ λͺ¨λ“  μ „νˆ¬κΈ°λ“€μ΄ λŒ€ν•΄μ„œ attck λ©”μ„œλ“œλ₯Ό 일일이 μˆ˜μ •ν•΄μ•Όν•˜λ©° 같은 λ©”μ„œλ“œλ₯Ό μ—¬λŸ¬ ν΄λž˜μŠ€μ—μ„œ λ˜‘κ°™μ΄ μ •μ˜ν•˜κ³  μžˆμœΌλ―€λ‘œ λ©”μ„œλ“œμ˜ μ€‘λ³΅λ¬Έμ œκ°€ λ°œμƒν•©λ‹ˆλ‹€.


μ „λž΅μ  νŒ¨ν„΄ 적용

μ „νˆ¬κΈ° μΆ”μƒν΄λž˜μŠ€

package strategy;

public abstract class Fighter {
    private String name;
    private AttackStrategy attackStrategy;

    public Fighter(String name) {
        this.name = name;
    }

    public void attack(){
        attackStrategy.attack();
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public AttackStrategy getAttackStrategy() {
        return attackStrategy;
    }

    public void setAttackStrategy(AttackStrategy attackStrategy) {
        this.attackStrategy = attackStrategy;
    }

}

MissileAttack κ΅¬ν˜„μ²΄

package strategy;

public class MissileAttack implements AttackStrategy{
    @Override
    public void attack() {
        System.out.println("미사일 곡격");
    }
}

GunAttack κ΅¬ν˜„μ²΄

package strategy;

public class GunAttack implements AttackStrategy{
    @Override
    public void attack() {
        System.out.println("총으둜 곡격");
    }
}


μ „νˆ¬κΈ°μ˜ 곡격 ν˜•νƒœλ₯Ό μΊ‘μŠν™” ν•˜μ—¬ μƒμ†λ³΄λ‹€λŠ” ꡬ성 (Composition)을 μ΄μš©ν•©λ‹ˆλ‹€. κ³΅κ²©μ΄λΌλŠ” ν–‰μœ„(행동)을 μΊ‘μŠν™” ν•˜μ—¬ Flight 클래슀의 변경을 λ§‰μŠ΅λ‹ˆλ‹€. μƒˆλ‘œμš΄ κΈ°λŠ₯을 μΆ”κ°€ μ‹œμ— 기쑴의 μ½”λ“œμ— 영ν–₯을 λ―ΈμΉ˜μ§€ μ•Šκ³  AttackStrategy μΈν„°νŽ˜μ΄μŠ€λ₯Ό 상속 λ°›μ•„ μƒˆλ‘œμš΄ κΈ°λŠ₯의 클래슀λ₯Ό λ§Œλ“€λ©΄ λ©λ‹ˆλ‹€. λ‘œμ§μ„ λ…λ¦­μ μœΌλ‘œ κ΄€λ¦¬ν•˜κΈ° μ‰½μŠ΅λ‹ˆλ‹€.

λ˜ν•œ setterλ₯Ό μ΄μš©ν•΄ μ™ΈλΆ€μ—μ„œ 상황에 맞게 ν•„μš”μ— 따라 μ „λž΅μ μœΌλ‘œ λ™μž‘ν•  κΈ°λŠ₯을 λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λ‘œμΈν•΄ μ‹œμŠ€ν…œμ΄ μœ μ—°ν•˜κ²Œ λ³€κ²½λ˜κ³  ν™•μž₯될 수 μžˆμŠ΅λ‹ˆλ‹€.

package strategy;

public class main {
    public static void main(String[] args) {
        Fighter f1 = new F1("F1");
        Fighter f2 = new F2("F2");

        f1.setAttackStrategy(new MissileAttack());
        f2.setAttackStrategy(new GunAttack());

        System.out.println(f1.getName()+" μ „νˆ¬κΈ°");
        f1.attack();

        System.out.println(f2.getName()+" μ „νˆ¬κΈ°");
        f2.attack();

        f2.setAttackStrategy(new MissileAttack());
        System.out.println(f2.getName()+" μ „νˆ¬κΈ°");
        f2.attack();
    }
}

strategy


끝

μ˜€λŠ˜μ€ μ „λž΅μ  νŒ¨ν„΄ (strategy pattern)에 λŒ€ν•΄ μ•Œμ•„λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

κ°μ‚¬ν•©λ‹ˆλ‹€. πŸ™

Reference

https://victorydntmd.tistory.com/292

https://flowarc.tistory.com/entry/1-Strategy-Pattern

Written on January 19, 2021