전략 패턴

태량·2023년 7월 11일
0
  1. Context ( 클래스에 대한 설명)
  • 추상 클래스 Robot이 있고, Robot은 name을 가지며, 추상 메서드 attack( ) 과 move( )을 갖는다. 그리고 하위 클래스 Atom과 TaekwonV는 추상 메서드를 각각 구현하였다.
  • Atom은 attack( )에서 주먹 공격(punch attack)만 가능하다. TaekwonV는 미사일 공격이 가능하다.
  • Atom은 move( )에서 날 수 있으며, TaekwonV는 날지 못하며, 걸어서 이동 할 수만 있다.
    public abstract class Robot {
    
        private String name;
    
        public Robot(String name) {
            this.name = name;
        }
    
        public abstract void move();
    
        public abstract void attack();
    }
    public class TaekwonV extends Robot{
    
        public TaekwonV(String name) {
            super(name);
        }
    
        @Override
        public void move() {
            System.out.println("I can only walk");
        }
    
        @Override
        public void attack() {
            System.out.println("I have Missile and can attack with it");
        }
    }
    public class Atom extends Robot{
    
        public Atom(String name) {
            super(name);
        }
    
        @Override
        public void move() {
            System.out.println("I have strong punch and can attack with it");
        }
    
        @Override
        public void attack() {
            System.out.println("I can fly");
        }
    }

b. 문제점

  • 기존 로봇의 공격 또는 이동 방법을 수정하려면 어떤 변경 작업을 해야 하는가? 예를 들어 아톰이 날 수는 없고 오직 걷게만 만들고 싶다면? 또는 태권V를 날게 하려면?
  • 새로운 로봇을 만들어 기존의 공격 또는 이동 방법을 추가하거나 수정하려면? 예를 들어 새로운 로봇으로 지구의 용사 선가드(Sungard 클래스)를 만들어 태권V의 미사일 공격 기능을 추가하려면?

c. 해결책

  1. AttackMode, MoveMode 인터페이스를 통한 DIP (의존 관계 역전)
  2. 쉽게 변화하는 mover( ), attack( ) 안의 구현된 코드 → 인터페이스로 캡슐화하여 변화하지 않는 것으로 변경 그리고 각 인터페이스 별로 구현체를 자유롭게 만들어서 확장 가능 <OCP 개방 폐쇄의 원칙 >
  3. 코드 중복의 제거.

public abstract class Robot {

    private AttackMode attackMode;
    private MoveMode moveMode;

    private String name;

    Robot(String name){
        this.name = name;
    }

    public String getName(){
        return name;
    }

    public void setAttackMode(AttackMode mode){
        this.attackMode = mode;
    }

    public void setMoveMode(MoveMode mode){
        this.moveMode = mode;
    }

    public void attack(){
        attackMode.attack();
    }
    public void move(){
        moveMode.move();
    }
}

class Atom extends Robot{

    Atom(String name) {
        super(name);
        attackMode = new FistMode();
        moveMode = new FlyMode();
    }

}

class TaekwonV extends Robot{

    TaekwonV(String name){
        super(name);
        attackMode = new MissileMode();
        moveMode = new WalkMode();
    }

}

class Sungard extends Robot{

    Sungard(String name){
        super(name);
        this.attackMode = new MissileMode();
        this.moveMode = new WalkMode();
    }

}
public interface AttackMode {

    public void attack();
}

class FistMode implements AttackMode {

    @Override
    public void attack() {
        System.out.println("주먹 공격");
    }
}

class MissileMode implements AttackMode {

    @Override
    public void attack() {
        System.out.println("미사일 공격!");
    }
}
public interface MoveMode {

    public void move();

}

class WalkMode implements MoveMode{

    @Override
    public void move() {
        System.out.println("걸어서 이동");
    }
}

class FlyMode implements MoveMode{
    @Override
    public void move() {
        System.out.println("날아서 이동");
    }
}

d. 전략 패턴 연습하기.

  • 전략 패턴을 사용해 다음 요구사항을 만족하는 코드를 작성하라.
    1. 회원은 이름과 누적 대여 금액을 갖는다.
    2. 책은 서명, 출판년도, 가격을 갖는다 ( 재고는 무한대라고 가정 )
    3. 회원은 하나의 책을 1권 이상 살 수 있다.
    4. 회원이 책을 살 때마다 누적 금액이 저장된다.
    5. 가격 정책에 따라 책 값이 할인되며 다른 가격 정책이 추가될 수 있다.
    6. 10년 이상된 책은 책 자체 할인, 누적 대여 금액이 만 원 이상이면 회원 할인, 그 외의 경우에는 할인이 되지 않는다.
profile
좋은 영향력과 교류를 위하여

0개의 댓글