導入
アダプターモード(アダプター)は、クラス(オブジェクト)のインターフェイス(メソッドまたは属性)を顧客が望む別のインターフェイス(メソッドまたは属性)に変換することです。アダプターモードにより、インターフェイスの非互換性のために元々一緒に動作できなかったクラス(オブジェクト)が可能になります。クイックラッパー。
文章
例を挙げましょう。アヒル(ドック)には、飛行(フライ)とQuacking(Quack)の動作がありますが、七面鳥には飛行(フライ)の動作もあり、その音はゴーブルです。七面鳥のQuack(Quack)のアクションの実装を主張する場合は、DuckのQuackメソッドを再利用できますが、特定の呼び出しはQuackでなければなりません。この時点で、七面鳥のアダプターを作成して、七面鳥がQuackメソッドもサポートし、Gobbleは内部で呼ばれる必要があります。
わかりました、私たちは段階的にそれを実装し始めます。まず、アヒルとトルコの抽象的な動作、つまりそれぞれの方法関数を定義する必要があります。
コードコピーは次のとおりです。
//アヒル
var duck = function(){
};
duck.prototype.fly = function(){
新しいエラーをスローします(「この方法は書き直す必要があります!」);
};
duck.prototype.quack = function(){
新しいエラーをスローします(「この方法は書き直す必要があります!」);
}
//七面鳥
var turkey = function(){
};
Turkey.prototype.fly = function(){
新しいエラーをスローします(「この方法は書き直す必要があります!」);
};
Turkey.prototype.gobble = function(){
新しいエラーをスローします(「この方法は書き直す必要があります!」);
};
次に、アヒルとトルコの特定のコンストラクターをそれぞれ定義します。
コードコピーは次のとおりです。
//アヒル
var mallardduck = function(){
duck.apply(this);
};
mallardduck.prototype = new Duck(); //プロトタイプはアヒルです
mallardduck.prototype.fly = function(){
console.log( "長距離で飛ぶことができます!");
};
mallardduck.prototype.quack = function(){
console.log( "gaga!gaga!");
};
//七面鳥
var wildturkey = function(){
Turkey.Apply(This);
};
wildturkey.prototype = new Turkey(); //プロトタイプはトルコです
wildturkey.prototype.fly = function(){
console.log( "飛行距離は少し短いようです!");
};
wildturkey.prototype.gobble = function(){
console.log( "gee!gee!");
};
トルコにQuackメソッドをサポートするために、新しい七面鳥のアダプター、TurkeyAdapterを作成しました。
コードコピーは次のとおりです。
var turkeyAdapter = function(oturkey){
duck.apply(this);
this.oturkey = oturkey;
};
turkeyAdapter.prototype = new Duck();
turkeyAdapter.prototype.quack = function(){
this.oturkey.gobble();
};
turkeyAdapter.prototype.fly = function(){
var nfly = 0;
var nlenfly = 5;
for(; nfly <nlenfly;){
this.oturkey.fly();
nfly = nfly + 1;
}
};
コンストラクターは七面鳥のインスタンスオブジェクトを取り、アダプターのプロトタイプがダックであるDuckを使用して適用し、その後、プロトタイプのQuackメソッドを再構築して、Oturkey.gobble()メソッドが内部で呼ばれるようにしたいと考えています。 Fly Methodはいくつかの変更を加えて、七面鳥が5回続けて飛ぶことができます(内部呼び出しは独自のOturkey.fly()メソッドとも呼ばれます)。
メソッドを呼び出すことは非常に明確です。テスト後、結果がわかります。
コードコピーは次のとおりです。
var omallardduck = new Mallardduck();
var owildturkey = new WildTurkey();
var oturkeyAdapter = new TurkeyAdapter(owildturkey);
//オリジナルのアヒルの動作
omallardduck.fly();
omallardduck.quack();
//元の七面鳥の行動
owildturkey.fly();
owildturkey.gobble();
//アダプター七面鳥の行動(トルコはアヒルの方法名)を呼び出す)
OturkeyAdapter.fly();
OturkeyAdapter.Quack();
要約します
では、アダプターモードを使用した場合はどうなりますか?以下の場合は使用することをお勧めします。
1.既存のオブジェクトを使用しますが、その方法または属性インターフェイスは要件を満たしていません。
2.他の無関係なオブジェクトや目に見えないオブジェクト(つまり、インターフェイスメソッドまたは属性と互換性のないオブジェクト)で動作できる再利用可能なオブジェクトを作成する必要があります。
3.既存のオブジェクトを使用したいのですが、それぞれがそのインターフェイスに一致するようにプロトタイプすることはできません。オブジェクトアダプターは、親オブジェクトインターフェイス方法またはプロパティに適応できます。
さらに、アダプターモードや他のいくつかのモードが混乱する可能性があります。一般的な違いは次のとおりです。
1.アダプターとブリッジモードは似ていますが、ブリッジの開始点は異なります。ブリッジの目的は、インターフェイスの部分と実装部分を分離して、それらをより簡単かつ比較的独立して変更できるようにすることです。アダプターは、既存のオブジェクトでインターフェイスを変更することを意味します。
2.デコレーターモードは、インターフェイスを変更せずに他のオブジェクトの機能を強化するため、対応するプログラムはアダプターよりも透明性が高くなります。その結果、デコレーターは再帰的な組み合わせをサポートし、アダプターを純粋に使用することは不可能です。
3.プロキシモードは、インターフェイスを変更せずに別のオブジェクトのプロキシを定義します。