์ค์ฌ์ ํจํด (Mediator Pattern)
๊ฐ์ฒด๋ค ๊ฐ์ ์ง์ ์ ์ธ ํต์ ์ ํผํ๊ณ ์ค์ฌ์ ๊ฐ์ฒด๋ฅผ ํตํด ์ํธ์์ฉํ๋๋ก ํ๋ ๋์์ธ ํจํด์
๋๋ค. ์ด๋ฅผ ํตํด ๊ฐ์ฒด ๊ฐ์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๊ณ , ์ ์ง๋ณด์์ฑ์ ํฅ์์ํค๋ฉฐ, ์์คํ
์ ์ ์ฐ์ฑ์ ๋์ผ ์ ์์ต๋๋ค.
์ฃผ์ ๋ชฉ์
โข
๋ณต์กํ ๊ฐ์ฒด ๊ฐ ์์กด์ฑ ์ ๊ฑฐ
โข
์ค์ ์ง์ค์ ์ ์ด ๋ฐฉ์ ๊ตฌํ
โข
๊ฐ์ฒด ๊ฐ ๊ฒฐํฉ๋ ๊ฐ์
โข
์ฝ๋ ์ฌ์ฌ์ฉ์ฑ ํฅ์
ํน์ง
โข
M:N ๊ด๊ณ๋ฅผ 1:1 ๊ด๊ณ๋ก ๋ณํ
โข
๊ฐ์ฒด ๊ฐ ํต์ ์ด ์ค์ฌ์๋ฅผ ํตํด์๋ง ์ด๋ฃจ์ด์ง
โข
๊ฐ์ฒด์ ๋ณ๊ฒฝ์ด ๋ค๋ฅธ ๊ฐ์ฒด์ ์ํฅ์ ๋ฏธ์น์ง ์์
โข
์ค์ฌ์ ๊ฐ์ฒด์ ๋ก์ง์ด ์ง์ค๋ ์ ์์
์์ ์ฝ๋
// Mediator ์ธํฐํ์ด์ค
interface Mediator {
void sendMessage(String message, User user);
void addUser(User user);
}
// ConcreteMediator (๊ตฌ์ฒด์ ์ธ ์ค์ฌ์)
class ChatRoom implements Mediator {
private List<User> users;
public ChatRoom() {
this.users = new ArrayList<>();
}
@Override
public void sendMessage(String message, User user) {
for (User u : users) {
// ์์ ์๊ฒ๋ ๋ฉ์์ง๋ฅผ ๋ณด๋ด์ง ์์
if (u != user) {
u.receive(message);
}
}
}
@Override
public void addUser(User user) {
this.users.add(user);
}
}
// Colleague (๋๋ฃ ๊ฐ์ฒด)
abstract class User {
protected Mediator mediator;
protected String name;
public User(Mediator mediator, String name) {
this.mediator = mediator;
this.name = name;
}
public abstract void send(String message);
public abstract void receive(String message);
}
// ConcreteColleague (๊ตฌ์ฒด์ ์ธ ๋๋ฃ ๊ฐ์ฒด)
class ConcreteUser extends User {
public ConcreteUser(Mediator mediator, String name) {
super(mediator, name);
}
@Override
public void send(String message) {
System.out.println(this.name + " sending: " + message);
mediator.sendMessage(message, this);
}
@Override
public void receive(String message) {
System.out.println(this.name + " received: " + message);
}
}
// Main ํด๋์ค์์ ์ฌ์ฉ ์์
public class MediatorPatternExample {
public static void main(String[] args) {
Mediator chatRoom = new ChatRoom();
User user1 = new ConcreteUser(chatRoom, "Alice");
User user2 = new ConcreteUser(chatRoom, "Bob");
User user3 = new ConcreteUser(chatRoom, "Charlie");
chatRoom.addUser(user1);
chatRoom.addUser(user2);
chatRoom.addUser(user3);
user1.send("Hello, everyone!");
user2.send("Hi Alice, how are you?");
}
}
Java
๋ณต์ฌ
์คํ๊ฒฐ๊ณผ
Alice sending: Hello, everyone!
Bob received: Hello, everyone!
Charlie received: Hello, everyone!
Bob sending: Hi Alice, how are you?
Alice received: Hi Alice, how are you?
Charlie received: Hi Alice, how are you?
Java
๋ณต์ฌ
์ด ์์ ์์ Alice๊ฐ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ฉด, ChatRoom ์ค์ฌ์๋ ๋ค๋ฅธ ์ฌ์ฉ์๋ค(Bob๊ณผ Charlie)์๊ฒ ๋ฉ์์ง๋ฅผ ์ ๋ฌํฉ๋๋ค. ๊ฐ ์ฌ์ฉ์๋ ์๋ก ์ง์ ํต์ ํ์ง ์๊ณ , ChatRoom์ ํตํด ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ์ต๋๋ค.
์ฝ๋ ์ค๋ช
์ ์์ ์ฝ๋๋ ์ฑํ
๋ฐฉ ์์คํ
์ ๊ตฌํํ ๊ฒ์ผ๋ก, ์ค์ฌ์ ํจํด์ ์ฃผ์ ๊ตฌ์ฑ ์์๋ฅผ ๋ณด์ฌ์ค๋๋ค:
โข
Mediator ์ธํฐํ์ด์ค: sendMessage ๋ฉ์๋๋ฅผ ํตํด ๋ฉ์์ง๋ฅผ ๋ค๋ฅธ ๋๋ฃ์๊ฒ ์ ๋ฌํ๊ณ , addUser ๋ฉ์๋๋ก ๋๋ฃ ๊ฐ์ฒด๋ฅผ ์ถ๊ฐํฉ๋๋ค.
โข
ConcreteMediator (ChatRoom): ์ฑํ
๋ฐฉ ์ญํ ์ ํ๋ฉฐ, ์ฌ์ฉ์๊ฐ ๋ณด๋ธ ๋ฉ์์ง๋ฅผ ๋ค๋ฅธ ๋ชจ๋ ์ฌ์ฉ์์๊ฒ ์ ๋ฌํ๋ ์ญํ ์ ํฉ๋๋ค. ๊ฐ ์ฌ์ฉ์๋ ์ง์ ์ ์ผ๋ก ๋ค๋ฅธ ์ฌ์ฉ์์๊ฒ ๋ฉ์์ง๋ฅผ ๋ณด๋ด์ง ์๊ณ , ์ค์ฌ์์ธ ChatRoom์ ํตํด ๋ฉ์์ง๋ฅผ ์ ๋ฌํฉ๋๋ค.
โข
User ํด๋์ค: ๊ฐ ์ฌ์ฉ์ ๊ฐ์ฒด๋ send ๋ฉ์๋๋ฅผ ํตํด ๋ฉ์์ง๋ฅผ ๋ณด๋ด๊ณ , receive ๋ฉ์๋๋ฅผ ํตํด ๋ฉ์์ง๋ฅผ ๋ฐ์ต๋๋ค. ๋ฉ์์ง๋ ์ค์ฌ์๋ฅผ ํตํด ์ ๋ฌ๋ฉ๋๋ค.
โข
ConcreteUser: User ํด๋์ค์ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ์ฒด๋ก, ์ค์ ๋ก ๋ฉ์์ง๋ฅผ ๋ณด๋ด๊ณ ๋ฐ๋ ๋๋ฃ ๊ฐ์ฒด์
๋๋ค.
์ด ๊ตฌ์กฐ์์ ๋ชจ๋ ์ฌ์ฉ์(UserImpl)๋ ์ง์ ํต์ ํ์ง ์๊ณ ์ฑํ
๋ฐฉ(ChatRoom)์ด๋ผ๋ ์ค์ฌ์๋ฅผ ํตํด ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ์ต๋๋ค. ์ด๋ฅผ ํตํด ์ฌ์ฉ์ ๊ฐ์ฒด๋ค ๊ฐ์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๊ณ ์ ์ฐํ ํต์ ๊ตฌ์กฐ๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค.
์ฅ๋จ์
์ฅ์
โข
๊ฐ์ฒด ๊ฐ ๊ฒฐํฉ๋๊ฐ ๋ฎ์์ ธ ์ ์ง๋ณด์๊ฐ ์ฉ์ดํฉ๋๋ค.
โข
์๋ก์ด ํ์
์ ํต์ ์ด๋ ๋์์ ์ถ๊ฐํ๊ธฐ ์ฝ์ต๋๋ค.
โข
๊ฐ์ฒด ๊ฐ ํต์ ๋ก์ง์ด ํ ๊ณณ์ ์ง์ค๋์ด ๊ด๋ฆฌ๊ฐ ํธํฉ๋๋ค.
๋จ์
โข
์ค์ฌ์ ํด๋์ค๊ฐ ๋ณต์กํด์ง ์ ์์ต๋๋ค.
โข
์ค์ฌ์์ ๋ํ ์์กด์ฑ์ด ์๊น๋๋ค.
โข
๊ท๋ชจ๊ฐ ์์ ์์คํ
์์๋ ์ค๋ฒํค๋๊ฐ ๋ ์ ์์ต๋๋ค.