소개하다
중재자 모드 (중재자)는 중재자 객체를 사용하여 일련의 객체 상호 작용을 캡슐화합니다. 중개자는 객체를 서로 명시 적으로 참조 할 필요가 없으므로 느슨하게 연결되어 상호 작용을 독립적으로 변경할 수 있습니다.
주요 내용은 http://www.addyosmani.com/resources/estentialjsdesignpatterns/book/#mediatorpatternjavaScript에서 나옵니다
텍스트
소프트웨어 개발에서 중개자는 통합 인터페이스를 제공하여 시스템의 다른 부분을 통신 할 수있는 행동 설계 패턴입니다. 일반적으로 시스템에 직접 전달 해야하는 많은 서브 모듈이있는 경우 각 모듈에 대해 중앙 제어 지점을 작성하여 중앙 제어 지점을 통해 상호 작용해야합니다. 중개 모델을 통해 이러한 서브 모듈은 직접적인 의사 소통없이 분리하는 목적을 달성 할 수 있습니다.
예를 들어, 일반적인 공항 교통 통제 시스템 인 타워는 중개자이며 항공기의 이륙 및 상륙 (서브 모듈)을 제어합니다. 모든 통신은 항공기 보고서에서 항공기 이전에 서로 통신하기보다는 타워로의 통신이 완료되기 때문입니다. 중앙 제어 시스템은 시스템의 핵심, 즉 소프트웨어 설계에서 중개자의 역할입니다.
먼저 의사 코드를 사용하여 이해해 봅시다.
코드 사본은 다음과 같습니다.
// 다음 코드는 의사 코드입니다. 코드에 너무 많은 관심을 기울이지 마십시오.
// 여기서 앱 네임 스페이스는 중개자의 역할을 수행하는 것과 같습니다.
var 앱 = 앱 || {};
// 앱 중개자를 통해 Ajax 요청을합니다
app.sendRequest = function (옵션) {
return $ .ajax ($. Extend ({}, 옵션);
}
// URL을 요청한 후보기를 표시하십시오
app.populeview = function (url, view) {
$. 시간 (App.SendRequest
. 그런데 (function () {
// 컨텐츠 표시
});
}
// 컨텐츠를 지우십시오
app.resetview = function (보기) {
View.html ( '');
}
JavaScript에서, 중개자는 관찰자 패턴의 메시지 버스와 동일하며 매우 일반적입니다. 그러나 이들은 PUB/Sub에 관찰자를 호출하여 구현되지 않지만 중개자가 통일 된 방식으로 관리합니다. 관찰자를 기반으로 한 예를 들어 보자.
코드 사본은 다음과 같습니다.
var mediator = (function () {
// 이벤트 구독 및 이벤트가 트리거 된 후 콜백 함수를 제공합니다.
var subscribe = function (channel, fn) {
if (! Mediator.Channels [Channel]) Mediator.Channels [Channel] = [];
Mediator.Channels [Channel] .Push ({Context : this, Callback : Fn});
이것을 반환하십시오;
},
// 이벤트 방송
게시 = 함수 (채널) {
if (! Mediator.Channels [Channel]) false를 반환합니다.
var args = array.prototype.slice.call (인수, 1);
for (var i = 0, l = mediator.channels [channel] .length; i <l; i ++) {
var subscription = mediator.Channels [채널] [i];
subscription.callback.apply (subscription.context, args);
}
이것을 반환하십시오;
};
반품 {
채널 : {},
게시 : 게시,
구독 : 구독,
installto : function (obj) {
obj.subscribe = 구독;
obj.publish = 게시;
}
};
} ());
코드를 호출하는 것은 비교적 간단합니다.
코드 사본은 다음과 같습니다.
(기능 (중재자) {
function initialize () {
// 기본값
Mediator.name = "Dudu";
// 이벤트 namechange를 구독하십시오
// 콜백 함수는 수정 전후에 정보를 표시합니다.
Mediator.subscribe ( 'Namechange', function (arg) {
Console.log (this.name);
this.name = arg;
Console.log (this.name);
});
}
함수 updateName () {
// 방송 트리거 이벤트, 매개 변수는 새로운 데이터입니다
Mediator.publish ( 'Namechange', 'Tom'); // Dudu, Tom
}
초기화 (); // 초기화
UpdateName (); // 부르다
})(중재인);
중개자 및 관찰자
이 시점에서 모든 사람이 혼란 스러울 수 있습니다. 중개자와 관찰자는 비슷해 보입니다. 차이점은 무엇입니까? 실제로는 조금 비슷하지만 특정 설명을 살펴 보겠습니다.
관찰자 패턴, 제약 조건을 캡슐화하지 않는 단일 객체. 반대로, 관찰자 관찰자와 콘크리트 클래스 주제는 제약을 유지하기 위해 함께 협력합니다. 커뮤니케이션은 여러 관찰자와 여러 콘크리트 클래스를 통해 상호 작용합니다. 각 콘크리트 클래스에는 일반적으로 여러 관찰자가 포함되며, 때로는 콘크리트 클래스의 한 관찰자도 다른 관찰자의 콘크리트 클래스이기도합니다.
중개 모델이하는 일은 단순히 분포가 아니라 이러한 제약을 유지하는 역할을합니다.
중개 및 외관 패턴
많은 사람들이 또한 중개자와 외관 패턴의 차이에 대해 혼란 스러울 수 있습니다. 둘 다 기존 모듈을 추상화하지만 미묘한 차이가 있습니다.
중개자가하는 일은 다 방향이지만 모듈간에 통신하는 것이지만 외관 모드는 추가 기능을 추가하지 않고 특정 모듈이나 시스템에 대한 간단한 인터페이스를 정의합니다. 시스템의 다른 모듈의 개념은 외관 모드와 직접 연결되지 않으며 일방적으로 간주 될 수 있습니다.
다음은 또 다른 완전한 예입니다.
코드 사본은 다음과 같습니다.
<! doctype html>
<html lang = "en">
<헤드>
<title> JavaScript 패턴 </title>
<meta charset = "utf-8">
</head>
<body>
<div id = "results"> </div>
<cript>
기능 플레이어 (이름) {
this.points = 0;
this.name = 이름;
}
player.prototype.play = function () {
this.points += 1;
Mediator.played ();
};
var scoreboard = {
// 컨텐츠를 표시하는 컨테이너
요소 : document.getElementById ( 'results'),
// 스코어 디스플레이 업데이트
업데이트 : 함수 (score) {
var i, msg = '';
for (i in score) {
if (score.hasownproperty (i)) {
msg + = '<p> <strong>' + i + '<// strong> :';
msg += 점수 [i];
msg += '<// p>';
}
}
this.element.innerhtml = msg;
}
};
var 중재자 = {
// 모든 플레이어
플레이어 : {},
// 초기화
설정 : function () {
var 플레이어 = this.players;
players.home = 새로운 플레이어 ( '홈');
players.guest = 새로운 플레이어 ( '게스트');
},
// 플레이 후, 점수를 업데이트하십시오
재생 : function () {
var 플레이어 = this.players,
점수 = {
홈 : players.home.points,
게스트 : players.guest.points
};
스코어 보드 .update (스코어);
},
// 사용자 키 상호 작용을 처리합니다
Keypress : 함수 (e) {
e = e || Window.event; // 즉
if (e.which === 49) {// 숫자 키 "1"
Mediator.players.home.play ();
반품;
}
if (e.which === 48) {// 숫자 키 "0"
Mediator.players.guest.play ();
반품;
}
}
};
// 가다!
Mediator.setup ();
Window.onkeypress = Mediator.Keypress;
// 30 초 후에 끝납니다
settimeout (function () {
Window.onKeypress = NULL;
Console.log ( '게임 오버!');
}, 30000);
</스크립트>
</body>
</html>
요약
중개 모드는 일반적으로 객체 그룹이 잘 정의되었지만 복잡한 방식으로 전달되는 상황에서 일반적으로 사용됩니다. 일반적으로, 중개 모드는 시스템에서 사용하기 쉽지만 시스템에서 오용하기 쉽습니다. 시스템에 다수의 상호 작용의 복잡한 객체 그룹이 나타나면 먼저 중개 모드를 사용하기 위해 서두르지 말고 시스템 설계에 문제가 있는지 생각해보십시오.
또한, 중개 모델은 상호 작용 복잡성을 중개자 자체의 복잡성으로 바꾸므로 중개 객체는 다른 물체보다 더 복잡합니다.