본문 바로가기

IT/디자인 패턴(Design Pattern)

[디자인 패턴] 중재자 패턴(Mediator Pattern)

1) 개요

객체들 간의 상호작용 행위를 정리하여 모은 중재자 객체를 따로 두어 관라히는 디자인 패턴입니다.


- 중재자 패턴이 사용되는 경우

- 객체들간의 관계가 매우 복잡하여 객체의 재사용에 부담이 갈 경우


- 장점

1. 객체들 간 수정을 하지않고 관계를 수정할 수 있습니다.

2. 객체들간의 관계의 복잡도, 의존성 및 결합도를 감소시킵니다.


- 단점

1. 중재자 패턴 사용 시 중재자 객체에 권한이 집중화되어 굉장히 크며 복잡해지므로, 설계 및 중재자 객체 수정 시 주의해야 합니다.


2) UML


- Mediator : Colleague 객체간의 상호작용을 위한 인터페이스를 정의합니다.

- ConcreteMediator : Mediator의 인터페이스를 구현하여 객체간의 상호작용을 조정합니다.

- Colleague : 다른 Colleague와의 상호작용을 위한 인터페이스를 정의합니다.

- ConcreteColleague : Colleague의 인터페이스를 구현하며 Mediator를 통해 다른 Colleague와 상호작용합니다.


3) 예제

1
2
3
4
public interface Command {
    void land();
}

cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Flight implements Command {
    private IATCMediator atcMediator;
    
    public Flight(IATCMediator atcMediator) {
        this.atcMediator = atcMediator;
    }
    
    @Override
    public void land() {
        if (atcMediator.isLandingOK()) {
            System.out.println("Successfylly Landed.");
            atcMediator.setLandingStatus(true);
        } else {
            System.out.println("Waiting for Landing.");
        }
    }
 
    public void getReady() {
        System.out.println("Ready for landing");
    }
}
cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Runway implements Command{
    private IATCMediator atcMediator;
    
    public Runway(IATCMediator atcMediator) {
        this.atcMediator = atcMediator;
        atcMediator.setLandingStatus(true);
    }
    
    @Override
    public void land() {
        System.out.println("Lading permission granted.");
        atcMediator.setLandingStatus(true);
    }
}
cs


1
2
3
4
5
6
7
public interface IATCMediator {
    public void registerRunway(Runway runway);
    public void registerFilght(Flight flight);
    public boolean isLandingOK();
    public void setLandingStatus(boolean status);
}
 
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class ATCMediator implements IATCMediator{
    private Flight flight;
    private Runway runway;
    public boolean land;
    
    @Override
    public void registerRunway(Runway runway) {
        this.runway = runway;
    }
 
    @Override
    public void registerFilght(Flight flight) {
        this.flight = flight;
    }
 
    @Override
    public boolean isLandingOK() {
        return land;
    }
 
    @Override
    public void setLandingStatus(boolean status) {
        land = status;
    }
}
cs


1
2
3
4
5
6
7
8
9
10
11
12
public class Main {
    public static void main(String[] args) {
        IATCMediator atcMediator = new ATCMediator();
        Flight cptJack = new Flight(atcMediator);
        Runway runnerWay = new Runway(atcMediator);
        atcMediator.registerFilght(cptJack);
        atcMediator.registerRunway(runnerWay);
        cptJack.getReady();
        runnerWay.land();
        cptJack.land();
    }
}
cs




RESULT

1
2
3
Ready for landing
Lading permission granted.
Successfylly Landed.
cs


- Reference :

https://www.geeksforgeeks.org/mediator-design-pattern/