브릿지 패턴은 구현부에서 추상층을 분리하여 각자 독립적으로 변형할 수 있도록 하는 패턴이다. 즉, 기능과 구현에 대해 별도의 클래스로 구현하여 서로의 코드에 간섭하지 않고 변형, 확장할 수 있도록 하는 것이다.
@AllArgsConstructor
public abstract class Pizza {
private String name;
private Recipe recipe;
public String result(){
return recipe.getName() + " " + name;
}
}
public class CheesePizza extends Pizza {
public CheesePizza(Recipe recipe){
super("치즈 피자", recipe);
}
}
public class PineapplePizza extends Pizza {
public PineapplePizza (Recipe recipe){
super("파인애플 피자", recipe);
}
}
Pizza가 있다. 그리고 Pizza를 상속받은 CheesePizza PineapplePizza 가 있다. 피자는 name과 recipe를 속성으로 가지고, result() 메서드를 호출하면 recipe.getName()이 어떤 값을 반환하는 지에 따라 결과가 달라진다.
public interface Recipe {
String getName();
}
public class DeliciousRecipe implements Recipe{
@Override
public String getName() {
return "맛있는";
}
}
public class NormalRecipe implements Recipe{
@Override
public String getName() {
return "그냥";
}
}
Recipe는 인터페이스이고 피자에 수식어를 달아주는 역할을 한다. Recipe을 인터페이스로 구현했기 때문에 Pizza는 Recipe을 자유자재로 바꿔낄 수 있다. Pizza의 종류가 변해도, 새로운 Recipe가 추가돼도, 기존의 코드를 바꿀 필요가 없다.
public class App {
public static void main(String[] args) {
DeliciousRecipe deliciousRecipe = new DeliciousRecipe();
NormalRecipe normalRecipe = new NormalRecipe();
Pizza pizza1 = new Pizza("파인애플 피자", deliciousRecipe);
Pizza pizza2 = new Pizza("치즈 피자", normalRecipe);
System.out.println("pizza1.result() = " + pizza1.result());
System.out.println("pizza2.result() = " + pizza2.result());
}
}
브릿지 패턴을 사용하면 이런식으로 다양한 종류의 피자를 만들 수 있다. 피자에서 레시피를 추상화하여 독립적인 클래스를 만들었기 때문이다.
이 링크로 가면 코드를 볼 수 있다.