Head First Design Patterns 책을 학습하며 공부한 내용을 정리한다.
가장 많이 쓰이는 패턴 중 하나로 추상화된 인터페이스로 캡슐화해서 각각을 교환해서 사용할 수 있도록 만든다. 이 패턴을 활용하면 클라이언트는 독립적으로 알고리즘을 변경할 수 있다.

추상클래스로서 FlyBehavior 인터페이스와 QuackBehavior 인터페이스를 주입 받아 performFly / performQuack 메서드에서 캡슐화 된 상태로 사용한다.
public abstract class Duck {
protected FlyBehavior flyBehavior;
protected QuackBehavior quackBehavior;
public void swim() {
System.out.println("Duck.swim");
}
public void display() {
System.out.println("Duck.display");
}
public void performFly() {
flyBehavior.fly();
}
public void performQuack() {
quackBehavior.quack();
}
//기타 오리 메서드
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
public void setQuackBehavior(QuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
}
}
Duck 추상 클래스의 서브 클래스로서 FlyBehavior 의 구현체인 FlyNoWay를 주입하고 QuackBehavior 의 구현체인 Quack 클래스를 주입 해서 사용한다.
public class ModelDuck extends Duck {
public ModelDuck() {
this.flyBehavior = new FlyNoWay();
this.quackBehavior = new Quack();
}
@Override
public void display() {
System.out.println("ModelDuck.display");
}
}
Duck 추상 클래스의 서브 클래스로서 FlyBehavior 의 구현체인 FlyWithWings를 주입하고 QuackBehavior 의 구현체인 Quack 클래스를 주입 해서 사용한다.
public class MallardDuck extends Duck {
public MallardDuck() {
this.quackBehavior = new Quack();
this.flyBehavior = new FlyWithWings();
}
@Override
public void display() {
System.out.println("MallardDuck.display");
}
}
어떻게 날으는 지를 의미하는 인터페이스
public interface FlyBehavior {
void fly();
}
FlyNoWay : 날지 못하는 오리를 의미하는 FlyBehavior 구현 클래스
FlyWithWings : 날개로 나는 오리를 의미하는 FlyBehavior 구현 클래스
public class FlyNoWay implements FlyBehavior {
@Override
public void fly() {
System.out.println("FlyNoWay.fly");
}
}
public class FlyWithWings implements FlyBehavior {
@Override
public void fly() {
System.out.println("FlyWithWings.fly");
}
}
꽥 소리가 어떻게 나는 지를 의미하는 인터페이스
public interface QuackBehavior {
void quack();
}
Quack : 꽥 하고 소리내는 오리를 정의한 QuackBehavior 구현 클래스
MuteQuack : 소리를 내지 못하는 오리를 정의한 QuackBehavior 구현 클래스
public class Quack implements QuackBehavior {
@Override
public void quack() {
System.out.println("Quack.quack");
}
}
public class MuteQuack implements QuackBehavior {
@Override
public void quack() {
System.out.println("MuteQuack.quack");
}
}
- 애플리케이션에서 달라지는 부분을 찾아내고, 달라지지 않는 부분으로 부터 분리 시킨다.
- 구현이 아닌 인터페이스에 맞춰서 프로그래밍 한다.
- 상속(A는 B이다) 보다는 구성(A에는 B가 있다)을 활용한다.
https://github.com/onlydev7777/TIL/tree/main/design-patterns