JavaScript 디자인 모드 (6): 관찰자 모드 와 게시 구독 모드
관찰자 모드: 대상 간 의 다 중 의존 관 계 를 정의 합 니 다. 대상 Subject 의 상태 가 바 뀌 면 모든 의존 대상 Observer 가 알림 을 받 습 니 다.
간단하게: 여신 에 게 남자친구 가 생 겼 어 요. 친구 들 이 사진 을 찍 고 달콤 한 선언 을 했 어 요. "할머니 가 성공 적 으로 옷 을 벗 었 으 니 기 쁘 시 길 바 랍 니 다."여러분, 스페어 타이어 가 줄줄 이 실연 을 당 해 자신 을 위로 할 수 밖 에 없습니다. 당신 은 유일한 사람 이 아 닙 니 다.
패턴 특징
Subject
, 소유 방법: 추가 / 삭제 / 알림 Observer
;Observer
, 보유 방법: 수신 Subject
상태 변경 통지 및 처리;Subject
상태 변경 시 모든 Observer
에 게 알 립 니 다.Subject
일련의 Observer
를 추가 하고 Subject
는 이들 Observer
과 의 관 계 를 유지 하 는 일 을 맡 았 다. "당신 이 나 에 게 관심 이 있 으 면 업데이트 하면 알려 줄 게 요."코드 구현
//
class Subject {
constructor() {
this.observers = []; //
}
//
add(observer) {
this.observers.push(observer);
}
//
remove(observer) {
let idx = this.observers.findIndex(item => item === observer);
idx > -1 && this.observers.splice(idx, 1);
}
//
notify() {
for (let observer of this.observers) {
observer.update();
}
}
}
//
class Observer {
constructor(name) {
this.name = name;
}
//
update() {
console.log(` , :${this.name}`);
}
}
//
let subject = new Subject();
//
let obs1 = new Observer(' ');
let obs2 = new Observer(' ');
//
subject.add(obs1);
subject.add(obs2);
//
subject.notify();
// :
// ,
// ,
우세 하 다.
불완전
관찰자 모드 는 대상 간 의존 관계 의 낮은 결합 을 실현 하지만 이벤트 알림 을 세분 화 할 수 없습니다. 예 를 들 어 '선별 알림', '테마 이벤트 알림 지정' 등 입 니 다.
예 를 들 어 위의 예 는 '전단 개발 자' 에 게 만 알려 줍 니까?관찰자 대상 은 어떻게 자신 이 필요 로 하 는 업데이트 알림 만 받 습 니까?상례 에서 두 관찰 자 는 목표 자의 상태 변경 통 지 를 받 은 후 모두
update()
실 행 했 고 구분 되 지 않 았 다."00 이후 개성 을 추구 하 는 시대 인 데 내 가 좀 다 를 수 있 을 까?" 라 고 우리 의 다음 모델 을 이 끌 어 냈 다.진급 판 관찰자 모드.'구독 모드 게시' 일부 글 은 둘 다 똑 같은 지 에 대해 논란 이 있다.
개인 적 인 관점 만 대표 합 니 다. 두 가지 모델 은 매우 유사 하지만 약간 다 릅 니 다. 바로 제3자 가 많 습 니 다. 자바 스 크 립 트 가 비정 규 직 대상 언어 를 대상 으로 하고 함수 리 셋 프로 그래 밍 의 특징 으로 인해 '구독 모드 발표' 가 자바 스 크 립 트 에서 코드 를 실현 하 는 것 은 '관찰 모드' 와 같 습 니 다.
게시 구독 모드 (게시 자 & 구독 자)
게시 구독 모드: 이벤트 (테마) 채널 을 기반 으로 알림 을 받 고자 하 는 대상 Subscriber 는 사용자 정의 이벤트 구독 테 마 를 통 해 이벤트 가 활성 화 된 대상 Publisher 는 테마 이 벤트 를 발표 하 는 방식 으로 각 테 마 를 구독 하 는 Subscriber 대상 에 게 알 립 니 다.
게시 구독 모드 는 관찰자 모드 와 달리 '제3자' (이벤트 센터) 가 나타난다.목표 대상 은 관찰자 에 게 직접 알 리 지 않 고 사건 센터 를 통 해 알 리 는 것 이다.
코드 구현
//
let pubSub = {
list: {},
subscribe: function (key, fn) { //
if (!this.list[key]) {
this.list[key] = [];
}
this.list[key].push(fn);
},
publish: function(key, ...arg) { //
for(let fn of this.list[key]) {
fn.call(this, ...arg);
}
},
unSubscribe: function (key, fn) { //
let fnList = this.list[key];
if (!fnList) return false;
if (!fn) {
// , key
fnList && (fnList.length = 0);
} else {
fnList.forEach((item, index) => {
if (item === fn) {
fnList.splice(index, 1);
}
})
}
}
}
//
pubSub.subscribe('onwork', time => {
console.log(` :${time}`);
})
pubSub.subscribe('offwork', time => {
console.log(` :${time}`);
})
pubSub.subscribe('launch', time => {
console.log(` :${time}`);
})
//
pubSub.publish('offwork', '18:00:00');
pubSub.publish('launch', '12:00:00');
//
pubSub.unSubscribe('onwork');
게시 구독 모드 에서 구독 자 는 각자 다른 논 리 를 실현 하고 자신 이 대응 하 는 이벤트 알림 만 받는다.당신 이 원 하 는 '다르다' 를 실현 하 세 요.
DOM 이벤트 감청 도 '구독 모드 게시' 의 응용 프로그램 입 니 다.
let loginBtn = document.getElementById('#loginBtn');
// ( )
function notifyClick() {
console.log(' ');
}
//
loginBtn.addEventListener('click', notifyClick);
// ,
loginBtn.click();
//
loginBtn.removeEventListener('click', notifyClick);
구독 발표 알림 순서:
on
와 trigger
, $.callback()
;$on/$emit
jQuery 의 $. Callback () 은 관찰자 모드 의 응용 과 같 아서 더 세밀 하 게 제어 할 수 없습니다.
function notifyHim(value) {
console.log('He say ' + value);
}
function notifyHer(value) {
console.log('She say ' + value);
}
$cb = $.Callbacks(); // :
$cb.add(notifyHim); // :
$cb.add(notifyHer); // :
$cb.fire('help'); // :
Vue 의 양 방향 데이터 바 인 딩
Object.defineProperty()
를 이용 하여 데 이 터 를 납치 하고 감청 기 Observer
를 설정 하여 데이터 대상 의 속성 을 감청 합 니 다. 속성 에 변화 가 생기 면 구독 자 Dep
에 게 데 이 터 를 업데이트 하 라 고 알 리 고 마지막 으로 명령 해석 기 Watcher
는 해당 하 는 명령 을 해석 하여 해당 하 는 업데이트 함 수 를 실행 하여 보 기 를 업데이트 합 니 다.쌍방 향 귀속 을 실현 하 였 다.Compile
(데이터 납치) Observer
(구독 발표) Dep
(데이터 감청) Watcher
(모델 컴 파일) Compile
에서 부모 구성 요 소 는 Vue
을 통 해 하위 구성 요소 에 데 이 터 를 전달 합 니 다 (위 에서 아래로 의 단 방향 데이터 흐름).부자 구성 요소 간 의 통신 은 사용자 정의 이벤트 props
, $on
를 통 해 이 루어 집 니 다 (하위 구성 요소 $emit
, 부모 구성 요소 $emit
.원 리 는 바로
$on
업데이트 통 지 를 발표 하고 $emit
구독 수신 통 지 를 받 는 것 이다. $on
에 서 는 Vue
(한 번 감청) $once
(구독 취소) 도 실현 되 었 다.//
vm.$on('test', function (msg) {
console.log(msg)
})
//
vm.$emit('test', 'hi')
불완전
유사 점
한 쌍 이상 의 의존 관 계 를 정의 하고 상태 가 변 경 될 때 해당 하 는 통 지 를 수행 합 니 다.
차이 점
게시 구독 모드 가 더욱 유연 하고 진급 판 의 관찰자 모드 로 해당 하 는 배 포 를 지정 합 니 다.
$off
속성 설명자; Object.defineProperty()
대리; 저자: 즐거움 의 이름 으로
이 글 은 오리지널 이 므 로 부당 한 부분 이 있 으 면 지적 을 환영 합 니 다. 전재 할 때 출처 를 밝 혀 주 십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 의 공장 모델, 단일 모델자바 는 23 가지 디자인 모델 (프로 그래 밍 사상/프로 그래 밍 방식) 이 있 습 니 다. 공장 모드 하나의 공장 류 를 만들어 같은 인 터 페 이 스 를 실현 한 일부 종 류 를 인 스 턴 스 로 만 드 는 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.