Rails Insights
```html

루비에서의 디자인 패턴: 미디에이터 패턴 구현하기

소프트웨어 개발에서 디자인 패턴은 문제를 해결하기 위한 일반적인 접근 방식을 제공합니다. 다양한 패턴 중에서도 미디에이터 패턴은 객체 간의 상호작용을 단순화하고, 객체들 간의 의존성을 줄이는 데 유용합니다. 이 글에서는 루비에서 미디에이터 패턴을 구현하는 방법을 알아보겠습니다.

미디에이터 패턴이란?

미디에이터 패턴은 객체 간의 통신을 관리하는 중재자(mediator) 역할을 하는 객체를 도입하여, 객체들이 직접적으로 서로와 상호작용하지 않도록 하는 패턴입니다. 이를 통해 객체 간의 결합도를 낮추고, 시스템의 유지보수성을 높일 수 있습니다.

미디에이터 패턴의 장점

  • 객체 간의 결합도를 낮춤
  • 상호작용을 중앙 집중화하여 관리 용이
  • 객체의 변경이 다른 객체에 미치는 영향을 최소화
  • 코드의 가독성과 유지보수성을 향상

미디에이터 패턴의 구조

미디에이터 패턴은 주로 네 가지 주요 구성 요소로 이루어져 있습니다:

  • 미디에이터(Mediator): 객체 간의 상호작용을 조정하는 인터페이스
  • 구체적인 미디에이터(Concrete Mediator): 미디에이터 인터페이스를 구현하여, 객체 간의 통신을 관리
  • 동료(Colleague): 미디에이터를 통해 서로와 상호작용하는 객체
  • 구체적인 동료(Concrete Colleague): 동료 인터페이스를 구현하여, 미디에이터를 통해 상호작용

루비에서 미디에이터 패턴 구현하기

이제 루비에서 미디에이터 패턴을 구현해 보겠습니다. 간단한 채팅 애플리케이션을 예로 들어, 사용자 간의 메시지 전송을 미디에이터를 통해 관리하는 구조를 만들어 보겠습니다.

1단계: 미디에이터 인터페이스 정의

먼저, 미디에이터 인터페이스를 정의합니다. 이 인터페이스는 동료 객체가 미디에이터를 통해 메시지를 전송하고 수신할 수 있도록 메서드를 선언합니다.

class Mediator
  def send_message(message, colleague)
    raise NotImplementedError, 'This method should be overridden'
  end
end

2단계: 구체적인 미디에이터 구현

이제 구체적인 미디에이터 클래스를 구현합니다. 이 클래스는 여러 동료 객체를 관리하고, 메시지를 전달하는 역할을 합니다.

class ChatMediator < Mediator
  def initialize
    @colleagues = []
  end

  def add_colleague(colleague)
    @colleagues << colleague
    colleague.mediator = self
  end

  def send_message(message, colleague)
    @colleagues.each do |c|
      if c != colleague
        c.receive_message(message)
      end
    end
  end
end

3단계: 동료 인터페이스 정의

동료 객체가 미디에이터와 상호작용할 수 있도록 동료 인터페이스를 정의합니다.

class Colleague
  attr_accessor :mediator

  def send_message(message)
    mediator.send_message(message, self)
  end

  def receive_message(message)
    raise NotImplementedError, 'This method should be overridden'
  end
end

4단계: 구체적인 동료 구현

이제 구체적인 동료 클래스를 구현합니다. 각 동료는 메시지를 전송하고 수신하는 기능을 가지게 됩니다.

class User < Colleague
  attr_reader :name

  def initialize(name)
    @name = name
  end

  def receive_message(message)
    puts "#{name} received: #{message}"
  end
end

전체 코드 예제

위에서 설명한 모든 클래스를 통합하여 전체 코드를 보여드리겠습니다.

class Mediator
  def send_message(message, colleague)
    raise NotImplementedError, 'This method should be overridden'
  end
end

class ChatMediator < Mediator
  def initialize
    @colleagues = []
  end

  def add_colleague(colleague)
    @colleagues << colleague
    colleague.mediator = self
  end

  def send_message(message, colleague)
    @colleagues.each do |c|
      if c != colleague
        c.receive_message(message)
      end
    end
  end
end

class Colleague
  attr_accessor :mediator

  def send_message(message)
    mediator.send_message(message, self)
  end

  def receive_message(message)
    raise NotImplementedError, 'This method should be overridden'
  end
end

class User < Colleague
  attr_reader :name

  def initialize(name)
    @name = name
  end

  def receive_message(message)
    puts "#{name} received: #{message}"
  end
end

# 사용 예제
mediator = ChatMediator.new

user1 = User.new('Alice')
user2 = User.new('Bob')
user3 = User.new('Charlie')

mediator.add_colleague(user1)
mediator.add_colleague(user2)
mediator.add_colleague(user3)

user1.send_message('Hello, everyone!')
user2.send_message('Hi, Alice!')

코드 설명

위의 코드는 간단한 채팅 애플리케이션을 구현한 예제입니다. 각 사용자(User) 객체는 미디에이터(ChatMediator)를 통해 메시지를 전송합니다. 사용자가 메시지를 보낼 때, 미디에이터는 해당 메시지를 다른 모든 사용자에게 전달합니다. 이 구조 덕분에 사용자 객체들은 서로 직접적으로 연결되지 않고, 미디에이터를 통해 간접적으로 상호작용하게 됩니다.

미디에이터 패턴의 활용

미디에이터 패턴은 다양한 상황에서 유용하게 사용될 수 있습니다. 예를 들어:

  • UI 컴포넌트 간의 상호작용 관리
  • 비즈니스 로직에서의 객체 간 통신 조정
  • 게임 개발에서의 캐릭터 간 상호작용 처리

결론

미디에이터 패턴은 객체 간의 의존성을 줄이고, 상호작용을 중앙 집중화하는 데 큰 도움이 됩니다. 루비에서의 구현을 통해 이 패턴의 구조와 동작 방식을 이해할 수 있었습니다. 실제 프로젝트에서도 이 패턴을 활용하여 코드의 가독성과 유지보수성을 향상시키는 것을 고려해 보시기 바랍니다.

```
Published: December 11, 2024

© 2024 RailsInsights. All rights reserved.