본문 바로가기

Design Pattern

[Design Pattern] 14. Bridge Pattern(브릿지 패턴) C#

728x90

인터페이스를 구현과 분리하여 독립적으로 변경할 수 있도록 도와주는 패턴입니다

 

구조 패턴(Structural Design Patterns)중 하나이죠.

 

장점

  • 플랫폼 독립적인 클래스들과 앱들을 만들 수 있습니다.
  • 상위 수준의 추상화를 통해 작동하며, 세부 정보에 노출되지 않습니다.
  • 개방/폐쇄 원칙을 만족하여 추상화와 구현들을 상호 독립적으로 추가할 수 있습니다.
  • 단일 책임 원칙을 만족하여 추상화된 인터페이스와 세부 정보 구현에 집중할 수 있습니다.

단점

  • 결합도가 높은 경우에 적용하여 더 복잡하게 만들 수 있습니다.

 

C#으로 Console 프로젝트를 하나 생성해서 할 것입니다.

 

목표는 이메일, SMS로 메세지를 보내겠습니다.

 

프로젝트의 tree구조는 아래와 같습니다.

Bridge (Project)

|- Program.cs (Main)

|- IMessageSender.cs (interface)

|- SMSSender.cs (Concrete Implementor)

|- EmailSender.cs (Concrete Implementor)

|- Message.cs (Abstraction)

|- TextMessage.cs (Refined Abstraction)

 

 

IMessageSender.cs

namespace Bridge
{
    public interface IMessageSender
    {
        void SendMessage(string message);
    }
}

메세지를 보낼 수 있게 SendMessage를 구성해 줍니다.


SMSSender.cs 

using System;

namespace Bridge
{
    public class SMSSender : IMessageSender
    {
        public void SendMessage(string message)
        {
            Console.WriteLine("Sending SNS Msg: " + message);
        }
    }
}

SMS에서 보냈다는 의미로 앞쪽에 Sending SNS Msg를 추가해서 구현해줍니다. 

 

EmailSender.cs 

using System;

namespace Bridge
{
    public class EmailSender : IMessageSender
    {
        public void SendMessage(string message)
        {
            Console.WriteLine("Sending Email Msg: " + message);
        }
    }
}

SMS와 다르게 Email에서 보냈다는 의미로 Sending Email Msg를 추가해서 구현해줍니다.

 

Message.cs

namespace Bridge
{
    public abstract class Message
    {
        protected IMessageSender messageSender;

        public Message(IMessageSender messageSender)
        {
            this.messageSender = messageSender;
        }

        public abstract void Send();
    }
}

MessageSender를 통해 메세지를 보낼 수 있게 구성해줍니다.

 

TextMessage.cs 

namespace Bridge
{
    public class TextMessage : Message
    {
        private string text;

        public TextMessage(string text, IMessageSender messageSender) : base(messageSender)
        {
            this.text = text;
        }

        public override void Send()
        {
            messageSender.SendMessage(text);
        }
    }
}

text로 Message내용을 저장하고 base인 부모 클래스로 messageSender를 전하고 Send를 구현해줍니다.

 

Program.cs

namespace Bridge
{
    class Program
    {
        public static void Main(string[] args)
        {
            Message emailMessage = new TextMessage("Email Msg", new EmailSender());
            emailMessage.Send();

            Message smsMessage = new TextMessage("SMS Msg", new SMSSender());
            smsMessage.Send();
        }
    }
}

먼저 EmailSender로 "Email Msg"를 보내줍니다.

다음에 SMSSenser로 "SMS Msg"를 보내줍니다.

아래의 실행 결과를 보시면 정상적으로 동작함을 확인할 수 있습니다.

실행 결과

 

이렇게 브릿지 패턴에 대해 알아 봤습니다.

플랫폼 독립적인 코딩이 가능해져 편리합니다.

다만 결합도가 높은 경우에 오히려 코드가 복잡해 지는 단점이 있네요.