소개하다
어댑터 모드 (어댑터)는 클래스 (개체)의 인터페이스 (메소드 또는 속성)를 고객이 원하는 다른 인터페이스 (메소드 또는 속성)로 변환하는 것입니다. 어댑터 모드를 사용하면 인터페이스의 비 호환성으로 인해 원래 함께 작동 할 수없는 클래스 (객체)를 허용합니다. 빠른 포장지.
텍스트
예를 들어 봅시다. 오리 (Dock)는 비행 (비행)과 quacking (quack)의 행동을 가지고 있으며, 칠면조는 비행 (비행)의 행동도 가지고 있으며 소리는 소리입니다. 터키의 Quack (Quack)의 행동을 구현할 것을 주장한다면, 우리는 Duck의 Quack 방법을 재사용 할 수 있지만 특정 호출은 quack이어야합니다. 현재 터키가 Quack 방법을 지원할 수 있도록 칠면조 어댑터를 만들 수 있으며 GoBble은 여전히 내부적으로 호출해야합니다.
좋아, 우리는 단계별로 구현하기 시작합니다. 먼저, 우리는 오리와 칠면조의 추상적 행동, 즉 각각의 방법 기능을 정의해야합니다.
코드 사본은 다음과 같습니다.
//오리
var duck = function () {
};
duck.prototype.fly = function () {
새 오류를 던지십시오 ( "이 방법을 다시 작성해야합니다!");
};
duck.prototype.quack = function () {
새 오류를 던지십시오 ( "이 방법을 다시 작성해야합니다!");
}
//칠면조
var 칠면조 = function () {
};
칠면조 .prototype.fly = function () {
새 오류를 던지십시오 ( "이 방법을 다시 작성해야합니다!");
};
칠면조 .prototype.gobble = function () {
새 오류를 던지십시오 ( "이 방법을 다시 작성해야합니다!");
};
그런 다음 오리와 칠면조의 특정 생성자를 각각 정의하십시오.
코드 사본은 다음과 같습니다.
//오리
var mallardduck = function () {
Duck.Apply (this);
};
mallardduck.prototype = 새로운 오리 (); // 프로토 타입은 오리입니다
mallardduck.prototype.fly = function () {
Console.log ( "장거리로 날 수 있습니다!");
};
mallardduck.prototype.quack = function () {
Console.log ( "Gaga! Gaga!");
};
//칠면조
var wildturkey = function () {
터키.
};
WildTurkey.prototype = 새로운 칠면조 (); // 프로토 타입은 터키입니다
wildturkey.prototype.fly = function () {
Console.log ( "비행 거리는 조금 짧은 것 같습니다!");
};
wildturkey.prototype.gobble = function () {
Console.log ( "gee! gee!");
};
터키가 Quack 방법을 지원하기 위해 새로운 칠면조 어댑터 인 TurkeyAdapter를 만들었습니다.
코드 사본은 다음과 같습니다.
var 칠면조 ADAPTER = 함수 (OTURKEY) {
Duck.Apply (this);
this.oturkey = oturkey;
};
칠면조 사막. 프로로 타입 = 새로운 오리 ();
칠면조 사막 .prototype.quack = function () {
this.oturkey.gobble ();
};
칠면조 사막 .prototype.fly = function () {
var nfly = 0;
var nlenfly = 5;
for (; nfly <nlenfly;) {
this.oturkey.fly ();
nfly = nfly + 1;
}
};
생성자는 터키의 인스턴스 객체를 취한 다음 어댑터 프로토 타입 인 Duck을 사용하여 적용한 다음 Oturkey.gobble () 메소드가 내부적으로 호출되도록 프로토 타입의 quack 메소드를 다시 수정하려고합니다. Fly 방법은 또한 몇 가지 변경을 수행하여 칠면조가 5 번 연속으로 비행 할 수 있습니다 (내부 호출은 자체 oturkey.fly () 메소드라고도합니다.
이 방법을 호출하는 것은 매우 명확합니다. 테스트 후 결과를 알 수 있습니다.
코드 사본은 다음과 같습니다.
var omallardduck = New MallardDuck ();
var owildturkey = New WildTurkey ();
var oturkeyadapter = 새로운 칠면조 사도터 (OwildTurkey);
// 원래 오리 행동
OmallardDuck.fly ();
OmallardDuck.quack ();
// 원래 칠면조 행동
owildturkey.fly ();
owildturkey.gobble ();
// 어댑터 칠면조 행동 (터키는 오리 메소드 이름을 부릅니다)
oturkeyadapter.fly ();
oturkeyadapter.quack ();
요약
어댑터 모드를 사용하면 어떻게됩니까? 다음을 사용하는 것이 좋습니다.
1. 기존 객체를 사용하지만 메소드 또는 속성 인터페이스는 요구 사항을 충족하지 않습니다.
2. 다른 관련이없는 객체 또는 보이지 않는 객체 (즉, 인터페이스 메소드 또는 속성과 호환되지 않는 개체)와 작동 할 수있는 재사용 가능한 객체를 생성하려고합니다.
3. 기존 객체를 사용하고 싶지만 인터페이스와 일치하도록 각각 프로토 타입 할 수는 없습니다. 객체 어댑터는 부모 객체 인터페이스 메소드 또는 속성에 적응할 수 있습니다.
또한 어댑터 모드 및 기타 여러 모드가 혼란 스러울 수 있습니다. 일반적인 차이점은 다음과 같습니다.
1. 어댑터와 브리지 모드는 비슷하지만 브리지의 출발점은 다릅니다. 브리지의 목적은 인터페이스 부분과 구현 부분을 분리하여보다 쉽고 비교적 독립적으로 변경할 수 있도록하는 것입니다. 어댑터는 기존 객체와의 인터페이스를 변경하는 것을 의미합니다.
2. 데코레이터 모드는 인터페이스를 변경하지 않고 다른 객체의 기능을 향상 시키므로 해당 프로그램이 어댑터보다 투명합니다. 그 결과 데코레이터는 재귀 조합을 지원하며 어댑터를 순전히 사용하는 것은 불가능합니다.
3. 프록시 모드는 인터페이스를 변경하지 않고 다른 객체의 프록시를 정의합니다.