Strategy pattern

1. 공통 행동을 인터페이스로 만든다.

FlyBehavior (날아다니는 행동)

public interface FlyBehavior {
public void fly();
}


QuackBehavior (꽥꽥 소리내는 행동)

public interface QuackBehavior {
public void quack();
}


2. 공통 인터페이스로 구현한 클래스 파일을 만든다. -> 캡슐화

public class FlyWithWings implements FlyBehavior {
public void fly() {
System.out.println("나는 날아다닌다");
}
}


public class FlyNoWay implements FlyBehavior {
public void fly() {
System.out.println("나는 날수없다");
}
}

public class FlyRocketPowered implements FlyBehavior {
public void fly() {
System.out.println("나는 로켓을 타고 날아간다");
}
}

3. 추상클래스를 만든다.  
   추상클래스 안에서 공통 공통 행동 인터페이스를 선언한다.
   공통 행동 인터페이스를 유연하게 만들기위해 set 매소드를 만든다.
   performFly() 매소드를 만들어서 공통 인터페이스에서 선언한 매소드를 실행할 수 있다.
   display() 매소드는 상속시 추가구현이 가능하다.
   swim() 매소드는 상속시 추가구현이 불가능하다. 

public abstract class Duck {
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;

public Duck() {}

public void setFlyBehavior(FlyBehavior fb) {
flyBehavior = fb;
}

public void setQuackBehavior(QuackBehavior qb) {
quackBehavior = qb;
}

public void performFly() {
flyBehavior.fly();
}

public void performQuack() {
quackBehavior.quack();
}

abstract void display();

public void swim() {
System.out.println("All ducks float, even decoys!");
}
}

4. 오리를 구현하는 클래스를 만든다.
   생성자 안에 duck 추상클래스에서 선언한 공통 행동 인터페이스를 객체화 한다.
   다른 오리를 구현할때는 같은 performFly() 매소드 이지만 객체화할때 다른 매소드를 넣음으로써 행동을 바꿀수있다.
   
public class MallardDuck extends Duck {

public MallardDuck() {

quackBehavior = new Quack();
flyBehavior = new FlyWithWings();

}

public void display() {
System.out.println("I'm a real Mallard duck");
}
}


5. 메인클래스로 실행한다.
public class MiniDuckSimulator2 {

public static void main(String[] args) {
MallardDuck mall = new MallardDuck();
mall.performFly();
mall.setFlyBehavior(new FlyRocketPowered());
mall.performFly();
}
}

결과값: 나는 날아간다!!
         나는 로켓을 타고 날아간다


mall.performFly(); 는 MallardDuck 클래스에서 구현한 FlyWithWings() 매소드가 실행된다.

MallardDuck 의 performFly() 는 "나는 날아간다!!" 이지만

setFlyBehavior 를 해서 "나는 로켓을 타고 날아간다" 가 가능 합니다.


정리: 다른 형식의 객체에서도 나는 행동과 꽥꽥거리는 행동을 재사용할 수 있다.
그리고 기존의 행동 클래스를 수정하거나 날아다는 행동을 사용하는 Duck 클래스를 전혀 건드리지않고도 
새로운 행동을 추가할 수 있다. -> 독립적 추가 및 변경이 가능

댓글

이 블로그의 인기 게시물

전자정부프레임워크 MSSQL 연동하기

request.getServletContext 가 빨간줄 생길때

자바스크립트로 confirm 을 이용한 페이지 이동