Bridge

GamSa Ham·2022년 10월 15일
0

GoF디자인패턴

목록 보기
7/22

1. 서론

  • 구현에서 추상을 분리하여, 이들이 독립적으로 다양성을 가질 수 있도록 합니다.
  • 가교(Bridge)는 핸들/구현부(Handle/Body)라고도 합니다.
  • 동기
    • 다른 플랫폼에 이식하기 어렵습니다.

2. 본론

  1) 활용성

  • 추상적 개념과 이에 대한 구현 사이의 지속적인 종속 관계를 피하고 싶을 때

  • 추상적 개념과 구현 모두가 독립적으로 서브클래싱을 통해 확장되어야 할 때

  • 추상적 개념에 대한 구현 내용을 변경하는 것이 다른 관련 프로그램에 아무런 영향을 주지 않아야 할 때

  • 클래스 계통에서 클래스 수가 급증하는 것을 방지하고자 할 때

  • 여러 객체들에 걸쳐 구현을 공유하고자 하며, 이를 사용자에게 공개하고 싶지 않을 때

    2) 구성요소

  • Abstraction : 추상적 개념에 대한 인터페이스를 제공하고 Implementor에 대한 참조자를 관리함

  • Refined Abstraction : Abstraction을 확장함

  • Implementor : 구현 클래스에 대한 인터페이스를 제공함

  • Concrete Implementor : Implementor를 구현하는 것

3) 결과

  • 인터페이스와 구현 분리
    • 구현이 인터페이스에 얽매이지 않게 됨.
    • 추상적 개념에 대한 어떤 방식의 구현을 택할지가 런타임에 결정될 수 있다.
      • Abstraction과 Implementor의 분리는 컴파일 타임 의존성을 제거할 수 있다.
      • 구현을 변경하더라도 추상적 개념에 대한 클래스와 추상적 개념 클래스와 관련된 다른 코드를 다시 컴파일할 필요가 없다.
    • 어떤 런타임에 어떤 객체가 자신의 구현을 수시로 변경할 수 있음을 의미함
    • 더 잘 구조화된 계층화도 가능하다.
      • Abstraction, Implementor만 알면 됨!!
  • 확장성 제고
    • Abstraction과 Implementor를 독립적으로 확장할 수 있다.
  • 구현 세부 사항을 사용자에게서 숨기기
    • 상세한 구현 내용을 사용자에게서 은닉 할 수 있다.

3. 구현

  • 구조

/

  • Abstraction
    
    package com.ramesh.gof.bridge;
    
    public abstract class MagicWeapon {
    
      protected MagicWeaponImpl imp;
    
      public MagicWeapon(MagicWeaponImpl imp) {
        this.imp = imp;
      }
    
      public abstract void wield();
    
      public abstract void swing();
    
      public abstract void unwield();
    
      public MagicWeaponImpl getImp() {
        return imp;
      }
    }
  • Implementor
    public abstract class MagicWeaponImpl {
    
      public abstract void wieldImp();
    
      public abstract void swingImp();
    
      public abstract void unwieldImp();
    
    }
  • Refined Abstraction
    public class BlindingMagicWeapon extends MagicWeapon {
    
      public BlindingMagicWeapon(BlindingMagicWeaponImpl imp) {
        super(imp);
      }
    
      @Override
      public BlindingMagicWeaponImpl getImp() {
        return (BlindingMagicWeaponImpl) imp;
      }
    
      @Override
      public void wield() {
        getImp().wieldImp();
      }
    
      @Override
      public void swing() {
        getImp().swingImp();
      }
    
      @Override
      public void unwield() {
        getImp().unwieldImp();
      }
    
      public void blind() {
        getImp().blindImp();
      }
    }
  • Concrete Implementor
    public abstract class BlindingMagicWeaponImpl extends MagicWeaponImpl {
    
      public abstract void blindImp();
    
    }
  • Excalibur
    public class Excalibur extends BlindingMagicWeaponImpl {
    
      @Override
      public void wieldImp() {
        System.out.println("wielding Excalibur");
      }
    
      @Override
      public void swingImp() {
        System.out.println("swinging Excalibur");
      }
    
      @Override
      public void unwieldImp() {
        System.out.println("unwielding Excalibur");
      }
    
      @Override
      public void blindImp() {
        System.out.println("bright light streams from Excalibur blinding the enemy");
      }
    }
  • App
    public static void main(String[] args) {
        BlindingMagicWeapon blindingMagicWeapon = new BlindingMagicWeapon(new Excalibur());
        blindingMagicWeapon.wield();
        blindingMagicWeapon.blind();
        blindingMagicWeapon.swing();
        blindingMagicWeapon.unwield();
    }
profile
안녕하세요. 자바를 좋아하고 디자인 패턴, Refactoring, Clean Code에 관심이 많은 백엔드 개발자입니다.

0개의 댓글