ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 행동(Behavioral) - 중재자(Mediator) 패턴
    Java/디자인패턴 2024. 11. 17. 21:01
    반응형

    중재자(Mediator) 패턴

    중재자(Mediator) 패턴은 행동(Behavioral) 패턴에 속합니다. 이 패턴은 객체 간의 복잡한 통신과 의존성을 줄이는 데 초점이 맞춰져 있습니다. 객체들이 서로 직접적으로 통신하는 대신, 중재자 객체를 통해 통신하게 하여 객체들 간의 결합도를 낮춥니다.


    중재자 패턴의 특징

    1. 역할 분리:
      • 객체들이 서로 직접 참조하거나 통신하지 않고, 중재자 객체가 중간에서 모든 상호작용을 관리합니다.
      • 서로 의존성을 낮추고 독립적인 재사용 가능성을 높입니다.
    2. 확장성 증가:
      • 객체의 추가나 변경이 중재자만 수정하면 되기 때문에 시스템 확장이 용이합니다.
    3. 복잡성 관리:
      • 여러 객체 간의 통신을 단순화하고, 객체 간 의존 관계를 명확하게 제어합니다.

    중재자 패턴 구조

    1. Mediator:
      • 객체들 간의 의사소통을 담당하며 인터페이스 또는 추상 클래스로 정의됩니다.
    2. ConcreteMediator:
      • Mediator 인터페이스를 구현하며, 객체들 간의 구체적인 상호작용을 정의합니다.
    3. Colleague:
      • Mediator와 소통하는 객체입니다. 서로 직접적으로 통신하지 않으며, Mediator를 통해 통신합니다.

    예제 코드 (JAVA)

    1. 인터페이스 및 중재자 정의

    // Mediator 인터페이스
    interface Mediator {
        void sendMessage(String message, Colleague colleague);
        void addColleague(Colleague colleague);
    }
    
    // Colleague 추상 클래스
    abstract class Colleague {
        protected Mediator mediator;
    
        public Colleague(Mediator mediator) {
            this.mediator = mediator;
        }
    
        public abstract void receiveMessage(String message);
    }

     

    2. 구체적인 중재자 구현

    import java.util.ArrayList;
    import java.util.List;
    
    class ConcreteMediator implements Mediator {
        private List<Colleague> colleagues = new ArrayList<>();
    
        @Override
        public void sendMessage(String message, Colleague sender) {
            for (Colleague colleague : colleagues) {
                // 메시지를 보낸 Colleague는 제외
                if (colleague != sender) {
                    colleague.receiveMessage(message);
                }
            }
        }
    
        @Override
        public void addColleague(Colleague colleague) {
            colleagues.add(colleague);
        }
    }

     

     

    3. Colleague 구현

    class ConcreteColleague extends Colleague {
    
        private String name;
    
        public ConcreteColleague(Mediator mediator, String name) {
            super(mediator);
            this.name = name;
            mediator.addColleague(this);
        }
    
        public void send(String message) {
            System.out.println(name + " sends: " + message);
            mediator.sendMessage(message, this);
        }
    
        @Override
        public void receiveMessage(String message) {
            System.out.println(name + " received: " + message);
        }
    }

     

     

    4. 사용 예시

    public class MediatorPatternExample {
        public static void main(String[] args) {
            Mediator mediator = new ConcreteMediator();
    
            Colleague colleague1 = new ConcreteColleague(mediator, "Colleague1");
            Colleague colleague2 = new ConcreteColleague(mediator, "Colleague2");
            Colleague colleague3 = new ConcreteColleague(mediator, "Colleague3");
    
            colleague1.send("Hello, everyone!");
            colleague2.send("Hi, Colleague1!");
            colleague3.send("Good to see you all!");
        }
    }

     

     

    실행 결과

    Colleague1 sends: Hello, everyone!
    Colleague2 received: Hello, everyone!
    Colleague3 received: Hello, everyone!
    
    Colleague2 sends: Hi, Colleague1!
    Colleague1 received: Hi, Colleague1!
    Colleague3 received: Hi, Colleague1!
    
    Colleague3 sends: Good to see you all!
    Colleague1 received: Good to see you all!
    Colleague2 received: Good to see you all!

     

     

    장점

    • 객체 간 결합도를 낮춤: 시스템의 모듈화와 유지보수성 증가.
    • 중앙 집중화된 로직: 객체 간의 통신 로직을 한 곳에서 관리 가능.

    단점

    • 중재자 복잡도 증가: 중재자가 모든 로직을 담당하므로 복잡도가 높아질 수 있음.
    • 단일 실패 지점: 중재자가 실패하면 시스템 전체에 영향을 미칠 수 있음.
    반응형

    댓글

Designed by Tistory.