일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- linux
- Spring Batch
- javascript
- 맛집
- ReactJS
- tool
- jenkins
- IntelliJ
- ubuntu
- Git
- Gradle
- Design Patterns
- AWS
- laravel
- db
- Web Server
- elasticsearch
- php
- Spring Boot
- java
- Spring
- jsp
- redis
- springboot
- devops
- 요리
- Oracle
- it
- MySQL
- JVM
Archives
- Today
- Total
아무거나
[Design Pattern] Mediator Pattern 본문
반응형
중재자 패턴(Mediator Pattern)
모든 클래스간의 복잡한 로직(상호작용)을 캡슐화하여 하나의 클래스에 위임하여 처리하는 패턴(M:N 관계를 1:1로 변경)
- 문자
- 1:N 으로 되므로 커뮤니케이션이 불편하다.
- 예를 들어 약속을 잡을때도 A, B, C, D 의 사람이 있다고하면 B는 약속이되고 C는 약속이 안되고 D도 약속이 안되는 등 제각각으로 연락해야하며 한명이 전체적인 의견을 한명씩 연락하여 물어봐야하므로 복잡하다.
- 그룹채팅
- 중간에 매개체가 있으로 커뮤니케이션에 용이하다.
아래는 해당 패턴의 기본 설계이다.
위의 굵게 표시된 부분은 우리가 직접 구현해야하고 그렇지 않은 부분은 추상클래스로 구현
- Mediator 에서는 협력해서 일하는 사람들 즉, 그 객체들을 담는 그릇이 있다. (=colleagues)
- Colleague 에서 colleagues는 mediator을 알아야하고 mediator또한 colleagues을 알아야 어떤 일이일어날지 각각에게 알려줄 수 있다.
- Mediator 에서는 같이 일하는 colleague를 넣을 수 있는 함수가 필요하다.(=addColleague) 해당 함수를 통해서 colleagues 목록에 담길 수 있다.
- Colleague 에는 어떤 mediator에 등록될지 정하는 함수가 필요하다.(=registerMediator)
- Colleague 에 어떤 일이 발생하였을때 Mediator에게 알려준다. (send, handle)
중재자 패턴 예시 - 1
먼저 contract 패키지를 추가하고 패키지안에 추상클래스를 추가하자.(Colleague, Mediator)
[Colleague.java]
package com.bkjeon.mediator.contract;
public abstract class Colleague {
private Mediator mediator;
public boolean join(Mediator mediator) {
if (mediator == null) {
return false;
}
this.mediator = mediator;
return mediator.addColleague(this);
}
public void sendData(String data) {
if (mediator != null) {
mediator.mediate(data);
}
}
abstract public void handle(String data);
}
[Mediator.java]
package com.bkjeon.mediator.contract;
import java.util.ArrayList;
import java.util.List;
public abstract class Mediator {
protected List<Colleague> colleagues;
public Mediator() {
colleagues = new ArrayList<>();
}
public boolean addColleague(Colleague colleague) {
if (colleagues != null) {
return colleagues.add(colleague);
} else {
return false;
}
}
public abstract void mediate(String data);
}
메세지 관련된 클래스들을 구현하자.(ChatMediator, ChatColleague)
[ChatMediator.java]
package com.bkjeon.mediator;
import com.bkjeon.mediator.contract.Colleague;
import com.bkjeon.mediator.contract.Mediator;
public class ChatMediator extends Mediator {
@Override
public void mediate(String data) {
for (Colleague colleague : colleagues) {
// 중재가능성 ( ex: 누구한테만 보낼지 안보낼지, 시간에 따라 다르게 보낼지, 두번 보낼지 등.. )
colleague.handle(data);
}
}
}
[ChatColleague.java]
package com.bkjeon.mediator;
import com.bkjeon.mediator.contract.Colleague;
public class ChatColleague extends Colleague {
@Override
public void handle(String data) {
System.out.println(this + "-" + data);
}
}
메인 함수를 구현하자.
[Main.java]
package com.bkjeon.mediator;
import com.bkjeon.mediator.contract.Colleague;
import com.bkjeon.mediator.contract.Mediator;
public class Main {
public static void main(String[] args) {
Mediator mediator = new ChatMediator();
Colleague colleague1 = new ChatColleague();
Colleague colleague2 = new ChatColleague();
Colleague colleague3 = new ChatColleague();
colleague1.join(mediator);
colleague2.join(mediator);
colleague3.join(mediator);
colleague1.sendData("AAA");
colleague2.sendData("BBB");
colleague3.sendData("CCC");
}
}
실행결과
com.bkjeon.mediator.ChatColleague@4f3f5b24-AAA
com.bkjeon.mediator.ChatColleague@15aeb7ab-AAA
com.bkjeon.mediator.ChatColleague@7b23ec81-AAA
com.bkjeon.mediator.ChatColleague@4f3f5b24-BBB
com.bkjeon.mediator.ChatColleague@15aeb7ab-BBB
com.bkjeon.mediator.ChatColleague@7b23ec81-BBB
com.bkjeon.mediator.ChatColleague@4f3f5b24-CCC
com.bkjeon.mediator.ChatColleague@15aeb7ab-CCC
com.bkjeon.mediator.ChatColleague@7b23ec81-CCC
위의 메인함수를 보면 colleague들이 어떤 mediator에 join 되어있고 데이터를 보내면은 mediator가 받고 colleague들이 같이 주고받는 형태가된다.
반응형
'Java & Kotlin > Java' 카테고리의 다른 글
[Design Pattern] Memento Pattern (0) | 2020.01.12 |
---|---|
[Design Pattern] State Pattern (0) | 2020.01.10 |
[Design Pattern] Observer Pattern (0) | 2020.01.05 |
[Design Pattern] Facade Pattern (0) | 2020.01.04 |
[Design Pattern] Chain of Responsibility Pattern (0) | 2020.01.04 |
Comments