728x90
Strategy pattern
- ์ค๋ฆฌ ์๋ฎฌ๋ ์ด์
ํ๋ก๊ทธ๋จ
- ๋ชจ๋ ์ค๋ฆฌ๋ ๊ฝฅ๊ฝฅ ์ธ ์ ์๊ณ , ์์์ ํ ์ ์์
- ์ด ๋ ์ข ๋ฅ์ ํ์๋ ์ค๋ฆฌ ๋ถ๋ชจ ํด๋์ค์์ ๊ตฌํ๋จ
- ์ค๋ฆฌ์ display ๋ฉ์๋๋ ์ถ์ ๋ฉ์๋์
- ์ค๋ฆฌ ํด๋์ค๋ ์ถ์ ํด๋์ค์
- ์ค๋ฆฌ์ ๋ชจ๋ ์์ํด๋์ค๋ display ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผ ํจ
- ์ฌ๊ธฐ ๋ ํด๋์ค ์ธ์ ๋ค์ํ ํด๋์ค๊ฐ ์์๋์ด ๊ตฌํ๋ ์ ์์
- ๋ฌธ์ ์ : ์ค๋ฆฌ ์๋ฎฌ๋ ์ด์ ํ๋ก๊ทธ๋จ์ ๊ฐ์ ํ๊ธฐ ์ํด fly ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ณ ์ถ๋ค๋ฉด??
- Design Pricinple 1
- Identify the aspects of your application that vary and separate them from what stays the same
- Design Pricinple 2
- Program to an interface, not an implementation
public abstract calss Duck{
protected FlyBehavior flyBehavior;
protected QuackBehavior quackBehavior;
...
public void quack(){
quackBehavior.quack();
}
}
- ์์กด๊ด๊ณ๊ฐ ์ฑ๋ฆฝํ๋ฏ๋ก ๋ฐ๋์งํ์ง ๋ชปํ๋ค.
public calss MallardDuck extends Duck{ public MallardDuck(){ flyBehavior = new FlyWithWings(); quackBehavior = new Quack(); } public void display(){ System.out.println("๋ ์ฒญ๋ฅ์ค๋ฆฌ"); } }
- Duck์์ flyBehaviordhk quackBehaviorfmf private์ผ๋ก ๋ฐ๊พธ์ด ์์ฑ์ ๊ด๊ณ ์ฃผ์
์ผ๋ก ํ์ฉํ๋ ๊ฒ์ด ํจ๊ณผ์
public calss MallardDuck (FlyBehavior flyBehavior, QuackBehavior quackBehavior){ super(flyBehavior, quackBehavior); }
์ฅ์
- flyBehavior๋ฅผ ์คํ์๊ฐ์ ๋ณ๊ฒฝํ ์ ์์
flyBehavior (new FlyNoWay()); duck.fly();
- ์๋ก์ด ์ค๋ฆฌํ์
์ ๋ง๋ค๊ธฐ ์ฌ์
public class ModelDuck extends Duck{ public ModelDuck(){ flyBehavior = new FlyNoWay(); quackBehavior = new Quack(); } ... }
- ์๋ก์ด ํ์ ์ถ๊ฐ๊ฐ ์ฌ์
public class FlyRocketPowered implements FlyBehavior { public void fly(){ System.out.println(" ๋ ๋ก์ผ์ผ๋ก ๋๋ค!!!"); } }
- ์๋ก์ด ์ค๋ฆฌํ์
์ ๋ง๋ค๊ธฐ ์ฌ์
- Design Pricinple 3
- Favor composition over inheritance.
์๋ฐ enum
public enum Flyable{
FlyNoWay{
@Override
public void fly(){}
}
FlyWithWings{
@Override
public void fly(){
System.out.println(" ๋ ๋ ๊ฐ๋ก ๋๋ค!!!");
}
}
FlyWithRockets{
@Override
public void fly(){
System.out.println(" ๋ ๋ก์ผ์ผ๋ก ๋๋ค!!!"); }
}
public abstract void fly();
}
public class MallardDuck extends Duck {
public MallardDuck(){
setFlyStrategy(Flyable.FlyWithWings);
}
์๋ฐ Lambda
public interface Flyable {
void fly()
}
Flyable flyWithBallons = ()->System.out.println("ํ์ ์ผ๋ก ๋ ๊ณ ์์");
Duck d = new MallardDuck();
d.display();
d.setFlyStrategy(flyWithBallons);
d.fly();
d.setFlyStrategy(()->System.out.println("Stealth ๊ธฐ๋ฅ์ผ๋ก ๋ ๊ณ ์์");
d.fly();
'๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ (OOP) > Design Pattern' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Design Pattern] Command Pattern (0) | 2021.09.24 |
---|---|
[Design Pattern] Abstract Factory Pattern (0) | 2021.09.04 |
[Design Pattern] Factory Method Pattern (0) | 2021.09.04 |
[Design Pattern] Observer Pattern (0) | 2021.09.04 |