-
스트래티지 패턴 (Strategy Pattern)Develpment/Design Pattern 2020. 9. 13. 21:18
1. 스트래티지 패턴
알고리즘군을 정의하고 각각을 캡슐화하여 바꿔 쓸 수 있게 만듭니다. 스트래티지 패턴을 이용하면 알고리즘을 활용하는 클라이언트와 독립적으로 알고리즘을 변경할 수 있습니다.
1-1. 객체지향의 기초
- 추상화
- 캡슐화
- 다형성
- 상속
1-2. 객체지향 원칙
- 바뀌는 부분은 캡슐화 한다.
- 상속보다는 구성을 활용한다.
- 구현이 아닌 인터페이스에 맞춰서 프로그래밍 한다.
1-3. Sample Source
- Quack
QuackBehavior.java
123456package fly;public interface FlyBehavior {public void fly();}cs Quack.java
1234567891011package quack;public class Quack implements QuackBehavior{@Overridepublic void quack() {System.out.println("꽥꽥~");}}cs MuteQuack.java
12345678910package quack;public class MuteQuack implements QuackBehavior{@Overridepublic void quack() {System.out.println("...");}}cs Squeak.java
1234567891011package quack;public class Squeak implements QuackBehavior{@Overridepublic void quack() {System.out.println("삑 삑~");}}cs - fly
FlyBehavior.java
123456package fly;public interface FlyBehavior {public void fly();}cs FlyNoWay.java
12345678910package fly;public class FlyNoWay implements FlyBehavior{@Overridepublic void fly() {System.out.println("못날아...");}}cs FlyWithWings.java
1234567891011package fly;public class FlyWithWings implements FlyBehavior{@Overridepublic void fly() {System.out.println("날고 있넹~");}}cs FlyRocketPowered.java
12345678910package fly;public class FlyRocketPowered implements FlyBehavior{@Overridepublic void fly() {System.out.println("로케트~~~~~~~~");}}cs - duck
Duck.java
1234567891011121314151617181920212223242526272829303132333435363738package duck;import fly.FlyBehavior;import quack.QuackBehavior;public abstract class Duck {/* 행동 인터페이스 형식의 레퍼런스 변수 두개를 선언합니다.* (같은 패키지에 속하는)모든 서브 클래스에서 이 변수를 상속 받습니다.*/QuackBehavior quackBehavior;FlyBehavior flyBehavior;public void performQuack(){quackBehavior.quack(); // 꽥꽥 거리는 행동을 직접 처리하는 대신, quackBehavior로 참조되는 객체에 그 행동을 위임.}public void performFly(){flyBehavior.fly(); // 행동 클래스에 위임.}public void swim(){System.out.println("모든 오리는 물에뜸...");}abstract void display();// 오리의 행동을 즉석에서 바꾸고 싶으면 언제든지 이 두 메소드를 호출public void setFlyBehavior(FlyBehavior fb){flyBehavior = fb;}public void setQuackBehavior(QuackBehavior qb){quackBehavior = qb;}}cs MallardDuck.java
1234567891011121314151617package duck;import fly.FlyWithWings;import quack.Quack;public class MallardDuck extends Duck{public MallardDuck() {quackBehavior = new Quack();flyBehavior = new FlyWithWings();}@Overridepublic void display(){System.out.println("저는 물오리입니다.");}}cs ModelDuck.java
12345678910111213141516package duck;import fly.FlyNoWay;import quack.Quack;public class ModelDuck extends Duck{public ModelDuck() {flyBehavior = new FlyNoWay();quackBehavior = new Quack();}public void display(){System.out.println("모형 오리...");}}cs - Simulation
MiniDuckSimulator.java
12345678910111213141516171819package duck;import fly.FlyRocketPowered;public class MiniDuckSimulator {public static void main(String[] args) {Duck mallard = new MallardDuck();mallard.performQuack();mallard.performFly();System.out.println("----------------------------------------");Duck model = new ModelDuck();model.performFly();model.setFlyBehavior(new FlyRocketPowered());model.performFly();}}cs 1-4. 실행결과
꽥꽥~
날고 있넹~
----------------------------------------
못날아...
로케트~~~~~~~~