인터페이스를 구현과 분리하여 독립적으로 변경할 수 있도록 도와주는 패턴입니다
구조 패턴(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"를 보내줍니다.
아래의 실행 결과를 보시면 정상적으로 동작함을 확인할 수 있습니다.
이렇게 브릿지 패턴에 대해 알아 봤습니다.
플랫폼 독립적인 코딩이 가능해져 편리합니다.
다만 결합도가 높은 경우에 오히려 코드가 복잡해 지는 단점이 있네요.
'Design Pattern' 카테고리의 다른 글
[Design Pattern] 16. Proxy Pattern(프록시 패턴) C# (0) | 2023.04.05 |
---|---|
[Design Pattern] 15. Flyweight Pattern(플라이웨이트 패턴) C# (0) | 2023.04.04 |
[Design Pattern] 13. Pacade Pattern(퍼사드 패턴) C# (0) | 2023.04.02 |
[Design Pattern] 12. Adapter Pattern(어댑터 패턴) C# (0) | 2023.04.01 |
[Design Pattern] 11. Memento Pattern(메멘토 패턴) C# (0) | 2023.03.31 |