Overview

동작을 클래스로 캡슐화하여 동작을 동적으로 변경할 수 있는 패턴
동일한 문제를 해결하는 많은 알고리즘이 클래스로 캡슐화되어 필요할 때 이를 대체하므로 동일한 문제를 다른 알고리즘으로 해결할 수 있습니다.

즉, 전략을 쉽게 변경할 수 있는 디자인 패턴입니다.
목적을 달성하기 위해 일을 하는 방식, 비즈니스 규칙, 문제를 해결하기 위한 알고리즘 등

전략
   - 인터페이스나 추상 클래스를 통해 외부에서 같은 방식으로 알고리즘을 호출하는 방법을 지정합니다.

구체적인 전략
   - 전략 패턴에 명시된 알고리즘을 실제로 구현하는 클래스

문맥
   - 전략 패턴을 사용하는 역할을 합니다.
   - 필요에 따라 특정 전략을 변경할 수 있는 세터 방식('집약적 관계')을 제공합니다.

Structure

https://m.blog.naver.com/2feelus/220658663151

 

Code Example

package com.example.design.pattern;

abstract class Duck {
	FlyBehavior flyBehavior;
	QuackBehavior quackBehavior;

	Duck() {
	}

	public abstract void display();

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

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

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

	public void setFlyBehavior(FlyBehavior flyBehavior) {
		this.flyBehavior = flyBehavior;
	}

	public void setQuackBehavior(QuackBehavior quackBehavior) {
		this.quackBehavior = quackBehavior;
	}
}

interface FlyBehavior {
	public void fly();
}

class FlyWithWings implements FlyBehavior {
	@Override
	public void fly() {
		System.out.println("I'm Flying!!");
	}
}

class FlyNoWay implements FlyBehavior {

	@Override
	public void fly() {
		System.out.println("I can't fly");
	}
}

interface QuackBehavior {
	public void quack();
}

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

class MuteQuack implements QuackBehavior {
	@Override
	public void quack() {
		System.out.println("<< Silence >>");

	}
}

class MallardDuck extends Duck {
	public MallardDuck() {
		flyBehavior = new FlyWithWings();
		quackBehavior = new Quack();
	}

	@Override
	public void display() {
		System.out.println("I'm a real Mallard Duck");

	}
}

public class MyStrategy {
	public static void main(String[] args) {
		Duck mallard = new MallardDuck();
		mallard.performQuack();
		mallard.perfomrFly();

		mallard.setFlyBehavior(new FlyNoWay());
		mallard.setQuackBehavior(new MuteQuack());
		
		mallard.performQuack();
		mallard.perfomrFly();
	}
}

 

Console Result

Quack!!
I'm Flying!!
<< Silence >>
I can't fly

 

Conclusion

N/A

728x90
12
반응형

+ Recent posts