제6장 프록시 모드
제6장 프록시 모드
6.1 첫 번째 예--샤오밍이 MM을 쫓는 이야기
var Flower = function () {};
var xiaoming = {
sendFlower : function(target){
var flower = new Flower();
target.receiveFlower(flower);
}
}
var A = {
receiveFlower:function(flower){
console.log(' '+flower);
}
}
xiaoming.sendFlower(A);
프록시 B 도입var Flower = function () {};
var xiaoming = {
sendFlower : function(target){
var flower = new Flower();
target.receiveFlower(flower);
}
}
var B = {
receiveFlower:function(flower){
A.receiveFlower(flower)
}
}
var A = {
receiveFlower:function(flower){
console.log(' '+flower);
}
}
xiaoming.sendFlower(B);
B는 A의 심경 변화를 감청합니다.var Flower = function () {};
var xiaoming = {
sendFlower : function(target){
var flower = new Flower();
target.receiveFlower(flower);
}
}
var B = {
receiveFlower:function(flower){
A.listenGoodMood(function(){
A.receiveFlower(flower)
});
}
}
var A = {
receiveFlower:function(flower){
console.log(' '+flower);
},
listenGoodMood:function(fn){
setTimeout(function(){
fn();
},3000);
}
}
xiaoming.sendFlower(B);
6.2 보호 에이전트 및 가상 에이전트
예를 들어 꽃을 보내는 사람 중 나이가 너무 많거나 보마가 없으면 대리 B에서 거절당할 수 있다. 이런 대리를 보호대리라고 한다.
하얀 얼굴 A는 계속해서 좋은 여신 이미지를 유지하고 누구도 거절하기를 원하지 않아 검은 얼굴 B를 찾아 A에 대한 방문을 통제했다
에이전트 B는 A가 기분이 좋을 때 new Flower를 실행합니다. 이를 가상 에이전트라고 합니다. 이것은 비용이 많이 드는 대상을 진정으로 필요로 할 때까지 늦추어 만듭니다.var B = {
receiveFlower:function(){
A.listenGoodMood(function(){
var flower = new flower();
A.receiveFlower(flower);
});
}
}
Javascript에서는 보호 에이전트를 실현하기가 쉽지 않습니다. 누가 어떤 대상에 접근했는지 판단할 수 없기 때문입니다.가상 에이전트는 가장 자주 사용하는 에이전트 모델로 본 장에서 주로 논의하는 것도 가상 에이전트이다.
6.3 가상 에이전트가 이미지 사전 로드를 실현
var myImage = (function(){
// body...
var imgNode = document.createElement('img');
document.body.appendChild(imgNode);
return {
setSrc : function(src){
imgNode.src = src;
}
}
})();
var proxyImage = (function(){
var img = new Image;
img.load = function(){
myImage.setSrc(this.src);
}
return {
setSrc:function(src){
myImage.setSrc('file://jdjisj.gif');
img.src = src;
}
}
})()
myImage.setSrc('http:wwjjfjds.jpg');
6.4 에이전트의 의미
프록시 없이 미리 불러오는 그림 함수 구현var myImage = (function(){
var imgNode = document.createElement('img');
document.body.appendChild(imgNode);
var img = new Image;
img.onload = function(){
imgNode.src = img.src;
};
return {
setSrc:function(){
imgNode.src = 'file://dsd.gif';
img.src = src;
}
}
})()
MyImage.setSrc('http://dsadsd.jpg');
객체에 대한 설계 원칙 – 단일 책임 원칙
대상을 대상으로 하는 디자인은 행위를 세립도의 대상에 분포하는 것을 장려한다. 만약에 한 대상이 맡은 직책이 너무 많으면 이런 직책을 한데 결합시키는 것과 같다. 이 중의 결합은 취약하고 낮은 내적 집합을 초래할 수 있다.변화가 발생할 때, 설계는 의외의 파환을 당할 수 있다.
대상 대상 프로그램에서 대부분의 경우 다른 어떤 원칙을 위반하면 개방-폐쇄 원칙을 위반한다.이 때 미리 불러오는 코드를 삭제하면 My Image 대상을 움직여야 합니다.
에이전트는 그림을 미리 불러온 후 요청을 본체에 다시 전달합니다.
미리 불러올 필요 없어요. 요청 프록시 대상이 아닌 요청 본체로 바꾸면 돼요.
6.5 에이전트와 본체 인터페이스의 일치성
에이전트 대상과 본체는 모두 대외적으로 setSrc 방법을 제공했다. 고객이 보기에 에이전트 대상과 본체는 일치하고 에이전트가 요청을 인수하는 과정은 사용자에게 투명하며 사용자는 에이전트와 본체의 차이를 잘 모른다.
var Flower = function () {};
var xiaoming = {
sendFlower : function(target){
var flower = new Flower();
target.receiveFlower(flower);
}
}
var A = {
receiveFlower:function(flower){
console.log(' '+flower);
}
}
xiaoming.sendFlower(A);
var Flower = function () {};
var xiaoming = {
sendFlower : function(target){
var flower = new Flower();
target.receiveFlower(flower);
}
}
var B = {
receiveFlower:function(flower){
A.receiveFlower(flower)
}
}
var A = {
receiveFlower:function(flower){
console.log(' '+flower);
}
}
xiaoming.sendFlower(B);
var Flower = function () {};
var xiaoming = {
sendFlower : function(target){
var flower = new Flower();
target.receiveFlower(flower);
}
}
var B = {
receiveFlower:function(flower){
A.listenGoodMood(function(){
A.receiveFlower(flower)
});
}
}
var A = {
receiveFlower:function(flower){
console.log(' '+flower);
},
listenGoodMood:function(fn){
setTimeout(function(){
fn();
},3000);
}
}
xiaoming.sendFlower(B);
var B = {
receiveFlower:function(){
A.listenGoodMood(function(){
var flower = new flower();
A.receiveFlower(flower);
});
}
}
var myImage = (function(){
// body...
var imgNode = document.createElement('img');
document.body.appendChild(imgNode);
return {
setSrc : function(src){
imgNode.src = src;
}
}
})();
var proxyImage = (function(){
var img = new Image;
img.load = function(){
myImage.setSrc(this.src);
}
return {
setSrc:function(src){
myImage.setSrc('file://jdjisj.gif');
img.src = src;
}
}
})()
myImage.setSrc('http:wwjjfjds.jpg');
var myImage = (function(){
var imgNode = document.createElement('img');
document.body.appendChild(imgNode);
var img = new Image;
img.onload = function(){
imgNode.src = img.src;
};
return {
setSrc:function(){
imgNode.src = 'file://dsd.gif';
img.src = src;
}
}
})()
MyImage.setSrc('http://dsadsd.jpg');
Javascript라는 언어에서 우리는 때때로 오리 유형을 통해 에이전트와 본체가 setSrc 방법을 실현했는지 검사한다. 또한 대다수는 심지어 검사를 하지 않고 모두 프로그래머의 자각성에 의존한다
인터페이스 없는 세상
만약 프록시 대상과 본체 대상이 모두 하나의 함수(함수도 대상)이면 함수는 반드시 실행될 수 있으며, 그것들도 일치하는'인터페이스'를 가지고 있다고 생각할 수 있다
var myImage = (function(){
var imgNode = document.createElement('img');
document.body.appendChild(imgNode);
return function(src){
imgNode.src = src;
}
})();
var proxyImage = (function(){
var img = new Image;
img.onload = function(){
myImage(this.src);
}
return function(src){
myImage('file:fsfdf.gif');
img.src = src;
}
})();
proxyImage('http://sds.jpg');
6.6 가상 에이전트 통합 HTTP 요청
Document
1
2
3
4
5
6
7
8
9
var synchronousFile = function(id){
console.log(' ,id :'+'id');
}
var checkbox = document.getElementsByTagName('input');
for(var i = 0,c; c = checkbox[i++];){
c.onclick = function(){
if (this.checked === true) {
synchronousFile(this.id);
}
}
}
이렇게 빈번한 네트워크 요청은 상당한 비용을 가져올 것이다
var synchronousFile = function(id){
console.log(' ,id :' + id);
}
var proxySynchronousFile = (function(){
var cache = [],timer;
return function(id){
cache.push(id);
if(timer){
return;
}
timer = setTimeout(function(){
synchronousFile(cache.join(','));
clearTimeout(timer);
timer = null;
cache.length = 0;
},2000)
}
})();
var checkbox = document.getElementsByTagName('input');
for(var i = 0,c;c = checkbox[i++]){
c.onclick = function(){
if (this.checked ===true) {
proxySynchronousFile(this.id);
}
}
}
6.7 가상 에이전트가 불활성 로드에서의 응용
var miniConsole = (function(){
var cache = [];
var handler = function(ev){
if(ev.keyCode === 113){
var script = document.createElement('script');
script.onload = function(){
for(var i = 0, fn;fn = cache[i++];){
fn();
}
}
script.src = 'miniConsole.js';
document.getElementsByTagName('head')[0].appendChild(script);
document.body.removeEventListener('keydown',handler);// miniConsole.js
}
};
document.body.addEventListener('keydown',handler,false);
return {
log:function(){
var args = arguments;
cache.push(function(){
return miniConsole.log.apply(miniConsole,args);
});
}
}
})();
miniConsole.log(11);
//miniConsole.js
miniConsole = {
log:function(){
//
console.log(Array.prototype.join.call(arguments));
}
}
6.8 캐시 에이전트
6.8.1 캐시 에이전트의 예 - 곱셈 계산
var mult = function(){
console.log(' ');
var a = 1;
for(var i=0, l = arguments.length;i
6.8.2 캐시 에이전트는 aax 비동기 요청 데이터에 사용
이미 가져온 데이터가 어딘가에 캐시된 후에 다음에 같은 페이지를 요청할 때 이전의 데이터를 직접 사용할 수 있습니다.
여기에도 캐시 에이전트를 도입할 수 있다. 실현 방식은 계산 곱셈의 예와 차이가 많지 않다. 유일하게 다른 것은 요청은 비동기적인 조작이다. 우리는 계산 결과를 에이전트 대상의 캐시에 넣을 수 없고 리셋을 통해
6.9 고급 함수로 동적 에이전트 만들기
var mult = function(){
var a = 1;
for(var i = 0,l = arguments.length;i
6.10 기타 프록시 모드
방화벽 모드: 네트워크 자원의 접근을 제어하고 테마가'나쁜 사람'이 원격 에이전트에 접근하지 못하게 보호합니다. 한 대상이 서로 다른 주소 공간에 국부적인 대표를 제공하고 JAVA에서 원격 에이전트는 다른 가상 기기의 대상 보호 에이전트일 수 있습니다. 대상이 서로 다른 접근 권한을 가져야 하는 경우에 사용됩니다.스마트 인용 횟수: 간단한 지침을 대체하여 대상에 접근할 때 추가 작업을 수행합니다. 예를 들어 대상이 인용된 횟수를 계산합니다.쓰기 시 복제 에이전트: 일반적으로 방대한 대상을 복제하는 데 사용됩니다.쓰기 시 복사 에이전트는 복사 과정을 지연시키고 대상이 진정으로 수정될 때 복사 작업을 합니다.쓰기 시 복제 에이전트는 가상 에이전트의 변체로 DLL(운영 체제의 동적 링크 라이브러리)은 전형적인 운용 장면이다
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.