Bridge Pattern

구현부에서 추상층을 분리하여 각자 독립적으로 변형이 가능함.

브릿지 패턴 특징

추상화를 이용한 구조패턴 중 하나
플랫폼 독립적인 클래스 및 앱을 만들 수 있다.
높은 수준의 추상화를 유지한다.
세부 정보를 노출 시키지 않는다.
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
복사

Reference