Search

์ค‘์žฌ์ž ํŒจํ„ด

์ค‘์žฌ์ž ํŒจํ„ด (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)์ด๋ผ๋Š” ์ค‘์žฌ์ž๋ฅผ ํ†ตํ•ด ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž ๊ฐ์ฒด๋“ค ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ์œ ์—ฐํ•œ ํ†ต์‹  ๊ตฌ์กฐ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์žฅ๋‹จ์ 

์žฅ์ 

โ€ข
๊ฐ์ฒด ๊ฐ„ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋‚ฎ์•„์ ธ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค.
โ€ข
์ƒˆ๋กœ์šด ํƒ€์ž…์˜ ํ†ต์‹ ์ด๋‚˜ ๋™์ž‘์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.
โ€ข
๊ฐ์ฒด ๊ฐ„ ํ†ต์‹  ๋กœ์ง์ด ํ•œ ๊ณณ์— ์ง‘์ค‘๋˜์–ด ๊ด€๋ฆฌ๊ฐ€ ํŽธํ•ฉ๋‹ˆ๋‹ค.

๋‹จ์ 

โ€ข
์ค‘์žฌ์ž ํด๋ž˜์Šค๊ฐ€ ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
โ€ข
์ค‘์žฌ์ž์— ๋Œ€ํ•œ ์˜์กด์„ฑ์ด ์ƒ๊น๋‹ˆ๋‹ค.
โ€ข
๊ทœ๋ชจ๊ฐ€ ์ž‘์€ ์‹œ์Šคํ…œ์—์„œ๋Š” ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.