브릿지 패턴은 구현부에서 추상층을 분리하여 각자 독립적으로 변형할 수 있도록 하는 패턴이다. 즉, 기능과 구현에 대해 별도의 클래스로 구현하여 서로의 코드에 간섭하지 않고 변형, 확장할 수 있도록 하는 것이다.

예시 코드
@AllArgsConstructorpublic 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()); }}
브릿지 패턴을 사용하면 이런식으로 다양한 종류의 피자를 만들 수 있다. 피자에서 레시피를 추상화하여 독립적인 클래스를 만들었기 때문이다.
이 링크로 가면 코드를 볼 수 있다.