SMALL

Strategy Pattern

객체들이 할 수 있는 행위 각각에 대해 전략 클래스를 생성하고, 유사한 행위들을 캡슐화하는 인터페이스를 정의하여, 객체의 행위를 동적으로 바꾸고 싶은 경우 직접 행위를 수정하지 않고 전략을 바꿔주기만 함으로써 행위를 유연하게 확장하는 방법을 말합니다.

 

간단히 말해서 

객체가 할 수 있는 행위들 각각을 전략으로 만들어 놓고, 동적으로 행위의 수정이 필요한 경우 전략을 바꾸는 것만으로 행위의 수정이 가능하도록 만든 패턴입니다.

 

 

객체지향 원칙

  • 바뀌는 부분은 캡슐화한다
  • 상속보다는 구성을 활용한다
  • 구현이 아닌 인터페이스에 맞춰서 프로그래밍한다

전략 패턴에서는 위의 원칙들을 포함하는 구조가 가능하다.

 

public abstract class Duck {
	
	FlyBehavior flyBehavior;
	QuackBehavior quackBehavior;
	
	public Duck() {
		
	}
	
	public void performFly() {
		flyBehavior.fly();
	}
	
	public void performQuack() {
		quackBehavior.quack();
	}
	
	public abstract void display();
	
	public void swim() {
		System.out.println("s w i m ~ ~ ");
	}
	
	public void setFlyBehavior(FlyBehavior fb) {
		flyBehavior = fb;
	}
	
	public void setQuackBehavior(QuackBehavior qb) {
		quackBehavior = qb;
	}
	
}

Duck에서는 FlyBehavior, QuackBehavior에 해당하는 전략을 가지고 있다.

 

public interface FlyBehavior {
	public void fly();
}

public interface QuackBehavior {
	public void quack();
}

 

그리고 마지막으로, Duck과 전략들의 구현체들을 보자

public class FlyNoWay implements FlyBehavior {
	@Override
	public void fly() {
		System.out.println(" I cannot fly ~ ");
	}
}

public class FlyWithWings implements FlyBehavior {
	@Override
	public void fly() {
		System.out.println(" fly in the moon ~ ");
	}
}

public class Quack implements QuackBehavior {
	@Override
	public void quack() {
		System.out.println("Quack ~~ Quack ~");
	}
}

public class Squeak implements QuackBehavior{
	@Override
	public void quack() {
		System.out.println("Squeak ~~ squeak ~ ");
	}
}

 

public class MallardDuck extends Duck {

	public MallardDuck() {
		quackBehavior = new Quack();
		flyBehavior = new FlyWithWings();
	}
	
	@Override
	public void display() {
		System.out.println("I'm MallarDuck~~ ~");
	}

}
LIST

+ Recent posts