중간 패턴


Mediator 패턴은 여러 개체와 클래스 간의 통신 복잡성을 줄이는 데 사용됩니다. 이 패턴은 일반적으로 서로 다른 클래스 간의 통신을 처리하고 느슨한 결합을 지원하는 중간 클래스를 제공하므로 코드를 더 쉽게 유지 관리할 수 있습니다. 중재자 모델은 행동 모델입니다.

소개

의도: 중개자 개체를 사용하여 일련의 개체 상호 작용을 캡슐화합니다. 중재자는 개체가 서로를 명시적으로 참조할 필요가 없으므로 개체 간의 상호 작용을 독립적으로 변경할 수 있습니다.

주요 솔루션: 객체 간에는 수많은 관계가 있으므로 필연적으로 시스템 구조가 매우 복잡해집니다. 동시에 객체가 변경되면 이와 관련된 객체도 추적해야 합니다. 적절한 조치를 취하십시오.

사용 시기: 여러 클래스가 서로 결합되어 네트워크 구조를 형성합니다.

해결 방법: 위의 메쉬 구조를 별 구조로 분리합니다.

키 코드: 객체 동료 간의 통신은 클래스로 캡슐화되어 별도로 처리됩니다.

적용 사례: 1. 중국이 WTO에 가입하기 전에는 여러 나라가 서로 무역을 했고, 지금은 WTO를 통해 여러 나라가 서로 무역을 하고 있습니다. 2. 공항 배차 시스템. 3. C(컨트롤러)가 M(모델)과 V(뷰) 사이의 중재자인 MVC 프레임워크.

장점: 1. 수업의 복잡성을 줄이고 일대다를 일대일로 전환합니다. 2. 다양한 클래스 간의 분리. 3. Dimit 원칙을 준수합니다.

단점: 중개자는 거대해지고 복잡해지고 유지 관리가 어려워집니다.

사용 시나리오: 1. 시스템의 개체 간에는 상대적으로 복잡한 참조 관계가 있어 개체 간의 종속성 구조가 혼란스럽고 개체를 재사용하기가 어렵습니다. 2. 너무 많은 하위 클래스를 생성하지 않고 여러 클래스의 동작을 캡슐화하기 위해 중간 클래스를 사용하고 싶습니다.

참고: 책임이 혼란스러울 때는 사용하면 안 됩니다.

구현

채팅방 예시를 통해 중재자 패턴을 보여줍니다. 이 경우 여러 사용자가 채팅방에 메시지를 보낼 수 있으며 채팅방은 모든 사용자에게 메시지를 표시합니다. ChatRoomUser이라는 두 개의 클래스를 생성하겠습니다. User 개체는 ChatRoom 메서드를 사용하여 메시지를 공유합니다.

MediatorPatternDemo, 데모 클래스는 User 개체를 사용하여 이들 간의 통신을 보여줍니다.

mediator_pattern_uml_diagram.jpg

1단계

중개 클래스를 생성합니다.

ChatRoom.java

import java.util.Date;

public class ChatRoom {
   public static void showMessage(User user, String message){
      System.out.println(new Date().toString()
         + " [" + user.getName() +"] : " + message);
   }
}

2단계

사용자 클래스를 생성합니다.

User.java

public class User {
   private String name;

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public User(String name){
      this.name  = name;
   }

   public void sendMessage(String message){
      ChatRoom.showMessage(this,message);
   }
}

3단계

User 개체를 사용하여 이들 간의 통신을 표시합니다.

MediatorPatternDemo.java

public class MediatorPatternDemo {
   public static void main(String[] args) {
      User robert = new User("Robert");
      User john = new User("John");

      robert.sendMessage("Hi! John!");
      john.sendMessage("Hello! Robert!");
   }
}

4단계

출력을 확인합니다.

rreee