구현부에서 추상층을 분리하여 각자 독립적으로 변형이 가능함.
브릿지 패턴 특징
•
추상화를 이용한 구조패턴 중 하나
•
플랫폼 독립적인 클래스 및 앱을 만들 수 있다.
•
높은 수준의 추상화를 유지한다.
•
세부 정보를 노출 시키지 않는다.
•
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
복사