ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 구조 패턴- 브릿지(Bridge) 패턴
    Java/디자인패턴 2024. 11. 11. 09:17
    반응형

    브릿지(Bridge) 패턴은 구조 패턴(Structural Pattern) 중 하나로, 구현부와 추상화된 인터페이스를 분리하여 서로 독립적으로 확장할 수 있도록 설계하는 패턴입니다. 이는 하나의 인터페이스에 다양한 구현을 적용할 수 있게 하여 코드의 유연성을 높이는 데 목적이 있습니다. 즉, 두 부분을 연결하는 ‘다리’를 놓아 서로 독립적인 수정과 확장을 가능하게 합니다.

    1. 브릿지 패턴의 목적

    브릿지 패턴은 코드의 결합도를 낮추고, 기능과 구현을 독립적으로 확장할 수 있도록 도와줍니다. 특히, 클래스 계층이 복잡해지거나 다양한 기능의 조합이 필요할 때 유용합니다.

    2. 브릿지 패턴의 구성 요소

    • 추상화(Abstraction): 클라이언트가 사용하는 최상위 인터페이스나 추상 클래스입니다. 이 클래스는 구현부(Implementor)와의 연계를 통해 기능을 정의하고, 구체적인 작업은 구현부에 위임합니다.
    • 확장된 추상화(RefinedAbstraction): 추상화의 구체적인 서브클래스로, 추가된 기능을 제공할 수 있습니다.
    • 구현부(Implementor): 추상화가 기대하는 인터페이스를 정의하는 부분으로, 실제 작업을 수행하는 역할을 합니다.
    • 구체적인 구현부(ConcreteImplementor): 구현부의 구체적인 서브클래스로, 특정한 방법으로 작업을 수행합니다.

    3. 브릿지 패턴의 예제 (Java)

    예를 들어, 기기(Device)와 플랫폼(Platform)의 두 개념이 있다고 가정해봅시다. 기기에는 TV와 Radio가 있고, 플랫폼은 Google과 Apple이 있습니다. 브릿지 패턴을 통해 다양한 기기가 다양한 플랫폼을 선택적으로 사용할 수 있도록 합니다.

    코드 예제

    // Implementor 인터페이스: Platform
    interface Platform {
        void play();
        void stop();
    }
    
    // ConcreteImplementor 클래스: GooglePlatform
    class GooglePlatform implements Platform {
        @Override
        public void play() {
            System.out.println("구글 플랫폼에서 재생");
        }
    
        @Override
        public void stop() {
            System.out.println("구글 플랫폼에서 정지");
        }
    }
    
    // ConcreteImplementor 클래스: ApplePlatform
    class ApplePlatform implements Platform {
        @Override
        public void play() {
            System.out.println("애플 플랫폼에서 재생");
        }
    
        @Override
        public void stop() {
            System.out.println("애플 플랫폼에서 정지");
        }
    }
    
    // Abstraction 클래스: Device
    abstract class Device {
        protected Platform platform;
    
        protected Device(Platform platform) {
            this.platform = platform;
        }
    
        abstract void turnOn();
        abstract void turnOff();
    }
    
    // RefinedAbstraction 클래스: TV
    class TV extends Device {
        public TV(Platform platform) {
            super(platform);
        }
    
        @Override
        void turnOn() {
            System.out.print("TV 켜기: ");
            platform.play();
        }
    
        @Override
        void turnOff() {
            System.out.print("TV 끄기: ");
            platform.stop();
        }
    }
    
    // RefinedAbstraction 클래스: Radio
    class Radio extends Device {
        public Radio(Platform platform) {
            super(platform);
        }
    
        @Override
        void turnOn() {
            System.out.print("라디오 켜기: ");
            platform.play();
        }
    
        @Override
        void turnOff() {
            System.out.print("라디오 끄기: ");
            platform.stop();
        }
    }
    
    // 클라이언트 코드
    public class BridgePatternExample {
        public static void main(String[] args) {
            Device tvWithGoogle = new TV(new GooglePlatform());
            Device radioWithApple = new Radio(new ApplePlatform());
    
            tvWithGoogle.turnOn(); // TV 켜기: 구글 플랫폼에서 재생
            tvWithGoogle.turnOff(); // TV 끄기: 구글 플랫폼에서 정지
    
            radioWithApple.turnOn(); // 라디오 켜기: 애플 플랫폼에서 재생
            radioWithApple.turnOff(); // 라디오 끄기: 애플 플랫폼에서 정지
        }
    }

    코드 설명

    • Platform 인터페이스는 구현부의 역할을 하며, GooglePlatform과 ApplePlatform은 이 인터페이스를 구현하여 각각의 플랫폼 기능을 제공합니다.
    • Device 추상 클래스는 추상화의 역할을 하며, platform 객체를 통해 Platform 기능을 사용합니다.
    • TV와 Radio 클래스는 Device의 확장된 추상화로, 각각 turnOn()과 turnOff() 메서드를 통해 기기를 켜고 끄는 구체적인 작업을 수행합니다.
    • 클라이언트 코드에서는 TV와 Radio 객체에 특정 플랫폼을 결합하여 사용합니다.

    4. 브릿지 패턴의 장점과 단점

    장점

    • 추상화와 구현부가 독립적으로 확장 가능하므로 유연성이 높아집니다.
    • 코드의 결합도를 낮추어 변경에 강한 구조를 만들 수 있습니다.

    단점

    • 코드가 복잡해질 수 있으며, 추상화와 구현부가 분리되어 관리해야 할 클래스가 많아질 수 있습니다.

    5. 브릿지 패턴의 사용 예시

    브릿지 패턴은 기기와 플랫폼 같은 독립적인 구조를 가진 경우, 다양한 UI와 DB 연결 구조처럼 두 개념이 독립적으로 변할 수 있는 경우에 유용하게 사용됩니다.

    반응형

    댓글

Designed by Tistory.