지난번에 관찰자 모드를 연구했을 때 많은 기사에서는 구독/게시 (게시/구독 모드)라고도합니다. 그러나 "JavaScript Design Pattern"이라는 책에는 여전히 두 패턴 사이에 약간의 차이가 있습니다. 책의 원래 단어는 다음과 같습니다.
1. 관찰자 모드에는 주제 알림을 받으려는 관찰자가 콘텐츠가 변경되는 이벤트를 구독해야합니다.
2. SubScribe/Publish Mode는 가입자와 게시자 사이에있는 테마/이벤트 채널을 사용합니다. 이벤트 시스템을 통해 코드는 응용 프로그램의 특정 이벤트를 정의 할 수 있으며, 구독자가 요구하는 값을 포함하는 사용자 정의 매개 변수를 전달할 수 있습니다. 목적은 가입자와 게시자 간의 종속성을 피하는 것입니다.
관찰자 모드와의 차이점은 가입자가 적절한 이벤트 핸들러를 실행하여 게시자로부터 알림을 등록하고받을 수 있다는 것입니다.
좋아, 나는 그렇게 강력 해지는 방법을 모른다. 내 이해는 다음과 같습니다.
1. 옵저버 모드에서 대상 객체는 관찰자를 유지 관리 할 책임이 있습니다. 게시/구독 모드에서 게시자는 가입자에 대해 신경 쓰지 않으며 메시지를 버리고 내버려 두는 데 책임이 있습니다.
2. 옵저버 모드에서 관찰자는 인터페이스를 제공 한 다음 대상 객체가 자체 상태와 대상 상태를 일관성있게 유지하기 위해이 인터페이스를 호출해야합니다. 즉, 모든 관찰자에게는 통합 인터페이스가 있어야합니다 (예 : 위에 쓰여진 업데이트 방법은 모든 사람의 방법을이 이름이라고 불러야합니다). 게시/가입 모드에서 가입자 이벤트의 트리거링은 그러한 인터페이스에 의존하지 않지만 구독자가 특정 메시지를 듣게하여 트리거됩니다 (이 메시지에는 일반적으로 가입자가 요구하는 이름과 매개 변수가 포함되어 있음). 가입자가 게시자가 아니라 메시지 풀을 듣고 있음을 이해할 수 있습니다. 메시지 풀에 관심이있는 메시지가있는 한 과거에 메시지를 누가 게시하든 이벤트를 트리거합니다. 게시자와 가입자는 분리됩니다.
다음은 JS에서 게시/구독 모드를 구현하는 것입니다. 콘솔에 복사하여 붙여 넣으면 시도한 후에는 이해할 수 있습니다.
코드 사본은 다음과 같습니다.
var pubsub = (function () {
var q = {}
주제 = {},
subuid = -1;
// 메시지를 게시합니다
q.publish = function (topic, args) {
if (! 주제 [주제]) {return;}
var subs = 주제 [주제],
len = subs.length;
while (len--) {
subs [len] .func (주제, args);
}
이것을 반환하십시오;
};
// 이벤트 구독
Q.SubScribe = function (주제, func) {
주제 [주제] = 주제 [주제]? 주제 [주제] : [];
var token = (++ subUid) .toString ();
주제 [주제] .push ({
토큰 : 토큰,
func : func
});
복귀 토큰;
};
반환 q;
// 구독 취소 및 쓰기 중지, 트래버스 주제, 다음 이전 요소를 저장하여 토큰을 반환하고 지정된 요소를 삭제하십시오.
}) ();
// 트리거 된 이벤트
var logmsg = 함수 (주제, 데이터) {
console.log ( "로깅 :" + 주제 + ":" + data);
}
// 지정된 메시지 'msgname'을 듣습니다.
var sub = pubsub.subscribe ( 'msgname', logmsg);
// 'msgname'메시지 게시
pubsub.publish ( 'msgname', 'Hello World');
// 발행되지 않은 메시지 'msgname1'게시
pubsub.publish ( 'Othermsgname', 'Me Too!');