구현부에서 추상층을 분리하여 각자 독립적으로 변형이 가능함.
브릿지 패턴 특징
•
추상화를 이용한 구조패턴 중 하나
•
플랫폼 독립적인 클래스 및 앱을 만들 수 있다.
•
높은 수준의 추상화를 유지한다. 
•
세부 정보를 노출 시키지 않는다.
•
OCP 를 달성한다.
•
SRP 를 달성한다.
단점
•
응집력이 높은 클래스에 패턴을 적용할 경우 코드가 더 복잡해진다.
사용 예시
브릿지 패턴 사용 전
브릿지 패턴 사용 후
브릿지 패턴 의 클래스 다이어그램
예제 - 동물의 왕국
•
동물의 최상위 클래스인 Animal이 존재하고 하위 클래스로 Bird와 Tiger가 존재함.
•
‘동물' 이라는 추상 객체의 ‘사냥방식’의 기능 구현 부분을 별도로 분리하여 구조 및 설계
Hunting_Handler
동물이 가질 수 있는 ‘사냥방식'의 공통 인터페이스 정의
// js
export interface HuntingHandler {
  findQuarry: () => string;
  detectedQuarry: () => string;
  attack: () => string;
}
JavaScript
복사
// java
public interface Hunting_Handler {
    public void Find_Quarry();
    public void Detected_Quarry();
    public void attack();
}
Java
복사
Hunting_Method1
// js
import { HuntingHandler } from './HuntingHandler';
export class HuntingMethod1 implements HuntingHandler {
  findQuarry = () => {
    return '물 위에서 찾는다.🌊';
  };
  detectedQuarry = () => {
    return '물고기🐟 발견!🤩';
  };
  attack = () => {
    return '낚아챈다.🍴';
  };
}
JavaScript
복사
// java
public class Hunting_Method1 implements Hunting_Handler {
    public void Find_Quarry()
    {
        System.out.println("물 위에서 찾는다");
    }
    public void Detected_Quarry()
    {
        System.out.println("물고기 발견!");
    }
    public void attack()
    {
        System.out.println("낚아챈다.");
    }
}
Java
복사
Hunting_Method2
// js
import { HuntingHandler } from './HuntingHandler';
export class HuntingMethod2 implements HuntingHandler {
  findQuarry = () => {
    return '숲에서 찾는다.🌲';
  };
  detectedQuarry = () => {
    return '사슴🦌 발견!🤩';
  };
  attack = () => {
    return '물어뜯는다.🍴';
  };
}
Java
복사
// java
public class Hunting_Method2 implements Hunting_Handler {
    public void Find_Quarry()
    {
        System.out.println("지상에서 찾는다");
    }
    public void Detected_Quarry()
    {
        System.out.println("노루 발견");
    }
    public void attack()
    {
        System.out.println("물어뜯는다.");
    }
}
Java
복사
Animal
•
최상위 클래스.
•
Hunting_Handler의 인스턴스를 가지고 각각의 Hunting_Handler를 상속받아 구현하고 있는 메서드들을 호출하고 있음.
// js
import { HuntingHandler } from './HuntingHandler';
export class Animal {
  private _hunting: HuntingHandler;
  constructor(hunting: HuntingHandler) {
    this._hunting = hunting;
  }
  findQuarry = (): string => {
    return this._hunting.findQuarry();
  };
  detectedQuarry = (): string => {
    return this._hunting.detectedQuarry();
  };
  attack = (): string => {
    return this._hunting.attack();
  };
  hunt = (): string => {
    return `${this.findQuarry()}<br/>
      ${this.detectedQuarry()}<br/>
      ${this.attack()}`;
  };
}
Java
복사
// java
public class Animal {
    
    private Hunting_Handler hunting;
    
    public Animal(Hunting_Handler hunting)
    {
        this.hunting=hunting;
    }
    public void Find_Quarry()
    {
        hunting.Find_Quarry();
    }
    public void Detected_Quarry()
    {
        hunting.Detected_Quarry();
    }
    public void attack()
    {
        hunting.attack();
    }
    public void hunt()
    {
        Find_Quarry();
        Detected_Quarry();
        attack();
    }
}
Java
복사
Bird(Eagle)
•
Animal를 확장한 하위 클래스.
•
Bird(Eagle)만의 추가적인 기능을 가질 수도 있음.
// js
import { Animal } from './Animal';
import { HuntingHandler } from './HuntingHandler';
export class Eagle extends Animal {
  constructor(hunting: HuntingHandler) {
    super(hunting);
  }
}
Java
복사
// java 
public class Bird extends Animal
{
    public Bird(Hunting_Handler hunting)
    {
        super(hunting);
    }
    public void hunt()
    {
        System.out.println("새의 사냥방식");
        Find_Quarry();
        Detected_Quarry();
        attack();
    }
}
Java
복사
Tiger
•
Animal를 확장한 하위 클래스.
•
Tiger만의 추가적인 기능을 가질 수도 있음.
// js
import { Animal } from './Animal';
import { HuntingHandler } from './HuntingHandler';
export class Tiger extends Animal {
  constructor(hunting: HuntingHandler) {
    super(hunting);
  }
}
Java
복사
// java
public class Tiger extends Animal
{
    public Tiger(Hunting_Handler hunting)
    {
        super(hunting);
    }
    public void hunt()
    {
        System.out.println("호랑이의 사냥방식");
        Find_Quarry();
        Detected_Quarry();
        attack();
    }
}
Java
복사
View(= Main)
// js
import { Eagle } from './ts/Eagle';
import { HuntingMethod1 } from './ts/HuntingMethod1';
import { Tiger } from './ts/Tiger';
import { HuntingMethod2 } from './ts/HuntingMethod2';
const $tigerBtn = <HTMLInputElement>document.querySelector('#tiger');
const $eagleBtn = <HTMLInputElement>document.querySelector('#eagle');
const $huterMethod = <HTMLInputElement>document.querySelector('#huter_method');
$tigerBtn.onclick = () => {
  const tiger = new Tiger(new HuntingMethod2());
  $huterMethod.innerHTML = tiger.hunt();
};
$eagleBtn.onclick = () => {
  const eagle = new Eagle(new HuntingMethod1());
  $huterMethod.innerHTML = eagle.hunt();
};
Java
복사
// java
public class Main {
    
    public static void main(String argsp[])
    {    
        Animal tiger = new Tiger(new Hunting_Method2());
        Animal bird = new Bird(new Hunting_Method1());
        
        tiger.hunt();
        System.out.println("--------------");
        bird.hunt();
    }
}
Java
복사



