안녕하세요. 이번 시간에는 중재자 패턴에 대해 알아보겠습니다! 여러 개의 객체들을 관리하는 패턴입니다.
베스파시아누스는 기나긴 양봉 생활을 끝내고 다시 능력을 인정받아 나중에 유대인 반란 진압 사령관으로 임명됩니다. 베스파시아누스는 효과적으로 반란을 진압하고 유대 지방을 다스릴 수 있었는데, 요세푸스라는 사람이 큰 역할을 했습니다. 요세푸스는 유대인이면서 로마에 사절단으로 있었기 때문에 정세에 밝았습니다. 요세푸스는 로마인과 유대인 사이에 중재자 역할을 하여 갈등을 해결하는 데 도움을 줬습니다. 일종의 대화를 주선한 건데요. 코드로 볼까요?
var Josephus = (function() {
function Josephus() {
this.participants = [];
}
Josephus.prototype.register = function(participant) {
this.participants.push(participant);
};
Josephus.prototype.deliver = function(sender, message) {
this.participants.forEach(function(participant) {
if (participant !== sender) {
console.log(sender + '님이 ' + participant + '님에게 "' + message + '"라고 말합니다.');
}
});
};
return Josephus;
})();
var josephus = new Josephus();
josephus.register('Jew');
josephus.register('Roman');
josephus.deliver('Jew', '우리 땅에서 물러가라!');
josephus.deliver('Roman', '네놈들을 멸망시켜주겠다!');
하하.. 실제로는 요세푸스가 그대로 전달하진 않았겠죠? 아마 험악한 말들을 완곡하게 돌려 전달했을 겁니다. 바꾸는 것은 직접 구현해보세요. 이 모습이 어떤 것과 비슷하지 않나요? 바로 채팅방이나 통역사와 비슷합니다. 서로의 말을 전달하는 공간을 마련했다는 점에서 채팅방과 비슷하고, 어떤 메세지를 바꿔서 표현할 수 있다는 점에서 통역과도 비슷합니다. 이들의 공통점은 모든 객체들이 이 중재자 객체를 거쳐야한다는 거죠.
참고로 요세푸스와 관련된 것 중에는 요세푸스 순열이라는 것도 있습니다. 요세푸스는 원래 유대 지방의 사령관이었습니다. 그러다 로마 베스파시아누스군의 침략을 받고, 결국 패배합니다. 패배할 당시에 동료 지휘관들과 함께 특정한 순서로 자결을 하기로 약속했습니다. 그렇게 한 명씩 죽다가 마지막에 요세푸스와 다른 사람 한 명이 남았는 데 그들은 마음을 바꿔 로마군에 항복했습니다. 정말 황당하죠? 이 때 그 자결하는 특정한 순서가 바로 요세푸스 순열입니다. 알고리즘 시간에 한 번 다뤄보겠습니다.
중재자 패턴은 여러 개의 객체들을 모두 관리하는 관제탑 같은 역할을 합니다. 등록된 객체들의 상황을 통제하고 관리할 수 있습니다. 이름처럼 중재자로서의 역할도 수행할 수 있고요. 채팅방 외에도 자원 분배기나 가계부같은 것에도 이 패턴을 사용할 수 있겠네요. 등록된 통장이나, 카드 등의 잔액을 한 번에 관리할 수 있습니다.
다음 시간에는 옵저버 패턴에 대해 알아보겠습니다!