* 상속을 잘 활용하면 재사용 할수 있지만, 실제 코드를 정비 하는데는 별 도움이 되지 않는다.

이런 식으로 코드를 구현하면 , 나중에 행동을 추가한다던지, 다른 오리를 추가 할때 문제가 발생한다.
코드를 재사용하는 점에서도 좋지 않고, 나중에 날아다니는, 꽥꽥 거리는 행동을 바꿀때, 모든 코드를 다 바꿔야하는 상황을 초래한다.
디자인 원칙 ) 애플리케이션에서 달라지는 부분을 찾아내고, 달라지지 않는 부분으로부터 분리시킨다. |
그렇다면, Duck클래스에서는 ?
나는 행동과 꽥꽥 거리는 행동을 분리 시킨다.

디자인 원칙 ) 구현이 아닌 인터페이스에 맞춰서 프로그래밍 한다. |


- 이런식으로 디자인 하면 다른 형식 개체에서도 나는 행동과 꽥꽥 행동을 재사용 할수 있다. (코드의 재사용)
- 그리고, 기존의 행동 클래스를 수정하거나 날아다니는 행동을 사용하는 Duck 클래스를 전혀 건드리지 않고도 새로운 행동을 추가 할수 있다.
*여기서 중요한 점은 quack() , fly() 를 클래스에 알맞게 실행 시킬수 있어야 한다.
만약 RubberDuck(장난감 고무오리) 는? - (날수 없다, 삑 소리를 낸다.)
//RubberDuck.java 중 생성자 부분.
public RubberDuck(){
flyBehavior = new FlyNoWay();
quackBehavior = new Squeak();
}
이런 식으로 각 오리의 특징에 맞게 생성자에서 초기화를 시켜줘야한다.
하지만, 실행중에 동적으로 행동을 지정할수는 없다.
그러려면 어떻게 해야하는가??
//Duck.java
public void setFlyBehavior( FlyBehavior fb ){
flyBehavior = fb;
}
public void setQuackBehavior( QuackBehavior qb){
quackBehavior = qb;
}
실행중에 동적으로 행동 지정하기. setter 메소드 사용!
아래는 main문에서 행동을 지정해주는 코드이다.
// main
Duck rubber = new RubberDuck(); // 못날음, 삑 소리를 냄
rubber.performFly();
rubber.setFlyBehavior( new RocketPowered() ); // 못나는 오리에게 로켓을 달아주었다.
rubber.performFly();
출력) 저는 못날아요.
로켓 추진으로 날아갑니다!
디자인 원칙 ) 상속보다는 구성을 활용한다. |

스트래티지 패턴(Strategy Pattern) 에서는 알고리즘군을 정의하고 각각을 캡슐화하여 교환해서 사용할 수 있도록 만든다. 스트래티지 를 잘 활용하면 알고리즘을 사용하는 클라이언트와는 독립적으로 알고리즘을 변경할 수 있다. |
* 상속을 잘 활용하면 재사용 할수 있지만, 실제 코드를 정비 하는데는 별 도움이 되지 않는다.

이런 식으로 코드를 구현하면 , 나중에 행동을 추가한다던지, 다른 오리를 추가 할때 문제가 발생한다.
코드를 재사용하는 점에서도 좋지 않고, 나중에 날아다니는, 꽥꽥 거리는 행동을 바꿀때, 모든 코드를 다 바꿔야하는 상황을 초래한다.
디자인 원칙 ) 애플리케이션에서 달라지는 부분을 찾아내고, 달라지지 않는 부분으로부터 분리시킨다. |
그렇다면, Duck클래스에서는 ?
나는 행동과 꽥꽥 거리는 행동을 분리 시킨다.

디자인 원칙 ) 구현이 아닌 인터페이스에 맞춰서 프로그래밍 한다. |


- 이런식으로 디자인 하면 다른 형식 개체에서도 나는 행동과 꽥꽥 행동을 재사용 할수 있다. (코드의 재사용)
- 그리고, 기존의 행동 클래스를 수정하거나 날아다니는 행동을 사용하는 Duck 클래스를 전혀 건드리지 않고도 새로운 행동을 추가 할수 있다.
*여기서 중요한 점은 quack() , fly() 를 클래스에 알맞게 실행 시킬수 있어야 한다.
만약 RubberDuck(장난감 고무오리) 는? - (날수 없다, 삑 소리를 낸다.)
//RubberDuck.java 중 생성자 부분.
public RubberDuck(){
flyBehavior = new FlyNoWay();
quackBehavior = new Squeak();
}
이런 식으로 각 오리의 특징에 맞게 생성자에서 초기화를 시켜줘야한다.
하지만, 실행중에 동적으로 행동을 지정할수는 없다.
그러려면 어떻게 해야하는가??
//Duck.java
public void setFlyBehavior( FlyBehavior fb ){
flyBehavior = fb;
}
public void setQuackBehavior( QuackBehavior qb){
quackBehavior = qb;
}
실행중에 동적으로 행동 지정하기. setter 메소드 사용!
아래는 main문에서 행동을 지정해주는 코드이다.
// main
Duck rubber = new RubberDuck(); // 못날음, 삑 소리를 냄
rubber.performFly();
rubber.setFlyBehavior( new RocketPowered() ); // 못나는 오리에게 로켓을 달아주었다.
rubber.performFly();
출력) 저는 못날아요.
로켓 추진으로 날아갑니다!
디자인 원칙 ) 상속보다는 구성을 활용한다. |

스트래티지 패턴(Strategy Pattern) 에서는 알고리즘군을 정의하고 각각을 캡슐화하여 교환해서 사용할 수 있도록 만든다. 스트래티지 를 잘 활용하면 알고리즘을 사용하는 클라이언트와는 독립적으로 알고리즘을 변경할 수 있다. |