カスタムアダプタモード
2つのクラスがインタフェースのミスマッチによって一緒に仕事をしていたそうという、別のを期待するクライアント・インタフェースへのクラスのアダプタモードのインターフェイスは、一緒に仕事することはできません。モードアダプタと、オブジェクトのアダプタモードクラス:アダプタモードでは、2つの異なる構成モードがあります。
免責事項:Javaは多重継承をサポートしていない、とクラスが一つだけの親を持つことができ、アダプターパターンのクラス図は、分類GoF本に基づいて本明細書で提示するというクラス図クラスアダプタよりも、クラス図、オブジェクトアダプタモードに属します。
アプリケーションシナリオの適用
あなたは3ピンのプラグを使用するように洗濯機を持っていると仮定し、2穴プラグを使ってテレビセットがあります。
図1に示すように、ターゲット(目標抽象クラス):抽象クラスは、特定の定義顧客がインタフェースが必要抽象クラスまたはインタフェースであってもよく、それは具体的なクラスであってもよいです。
2、Adaptee(フィッタクラス):フィッタすなわち役割を適応、既存のインターフェイスを定義し、このインタフェースアダプタが必要、フィッタは、一般的なカテゴリである特定のクラスの顧客が使用したい含みます、ビジネス方法。
図3に示すように、アダプタ(アダプタクラス):ニーズが元のターゲット・インターフェースにインターフェースを変換するように適合されているオブジェクトをラップすることによって。
キーコード
パッケージcom.AdapterPatternを。 パブリック 抽象 インタフェースThreeElectricOutlet { 公共の 抽象 無効connectElectricCurrent(); } パッケージcom.AdapterPatternを。 パブリック 抽象 インタフェースTwoElectricOutlet { 公共の 抽象 無効connectElectricCurrent(); } パッケージcom.AdapterPatternを。 パブリック クラス ThreeElectricAdapter 実装ThreeElectricOutlet { プライベートTwoElectricOutlet twoElectricOutlet。 公共ThreeElectricAdapter(TwoElectricOutlet twoElectricOutlet){ スーパー()。 この .twoElectricOutlet = twoElectricOutlet。 } 公共 のボイドconnectElectricCurrent(){ twoElectricOutlet.connectElectricCurrent(); } } パッケージcom.AdapterPatternを。 パブリック クラスアプリケーション{ 公共 静的 ボイドメイン(文字列[]引数){ 出口ThreeElectricOutlet; // ターゲット・インタフェース(三相界面) ウォッシュウォッシュ= 新しい新しい洗浄(); // 洗濯 出口=ウォッシュ; // 洗濯機は、三相コンセントに挿入された オン電流三相出口」のSystem.out.println( : " ); outlet.connectElectricCurrent(); // 現在がオンになっているが、洗濯物が始まり 、TV、TV = 新しい新 ; TV() // テレビ ThreeElectricAdapterアダプター= 新新 ThreeElectricAdapter(テレビ); // に挿入されたTVアダプタ アウトレット=アダプター; / / アダプタソケット相に差し込ま するSystem.out.println(「上の3相電流ソケット:」)。 outlet.connectElectricCurrent(); // 現在のスイッチがオンされ、番組を再生 } } クラス洗浄用具 ThreeElectricOutlet { // 三相出口用いて洗濯機 文字列名を、 パブリックウォッシュ(){ 名前 =「黄河洗濯機」。 } 公共ウォッシュ(文字列名){ この .nameの= 名前。 } 公共 のボイドconnectElectricCurrent(){ ターン(); } 公共 のボイドターン(){ System.out.println(名前 + "洗濯を開始します。" ); } } クラス TV 実装 TwoElectricOutlet { // TV二相出口 文字列名; 公共テレビ(){ 名前 =「長江テレビ」。 } 公共テレビ(列名){ この .nameの= 名前; } 公共 のボイドconnectElectricCurrent(){ ターン(); } 公共 のボイドターン(){ System.out.println(名前 +は、 "プログラム再生を開始します。" ); } }
双方向アダプタ
オブジェクト・アダプタ・モードでは、アダプタロール場合、ターゲット・インタフェースとアダプタインタフェースを実現し、目標が含まれており、参照により適合しながら、アダプタは双方向のアダプタです。双方向のアダプタを使用して、ユーザーがいずれか、既存のインターフェースを使用することができる新しいインターフェースを使用することができます。
たとえば:あなたはまた、洗濯機の古い2相電流のソケットを使用するがオンになっている、洗濯機、テレビのための新しい3相電流のソケットをオンにすることができるようにしたい場合は、双方向のアダプタを使用する必要があります。
コードは次のような双方向のアダプタです。
パッケージcom.AdapterPatternを。 パブリック クラス ThreeAndTwoElectricAdapter 実装ThreeElectricOutlet、TwoElectricOutlet { TwoElectricOutlet twoElectricOutlet; ThreeElectricOutlet threeElectricOutlet; 公共ThreeAndTwoElectricAdapter(TwoElectricOutlet twoElectricOutlet、ThreeElectricOutlet threeElectricOutlet){ スーパー()。 この .twoElectricOutlet = twoElectricOutlet。 この .threeElectricOutlet = threeElectricOutlet。 } 公共ThreeAndTwoElectricAdapter(ThreeElectricOutlet threeElectricOutlet、TwoElectricOutlet twoElectricOutlet){ スーパー()。 この .twoElectricOutlet = twoElectricOutlet。 この .threeElectricOutlet = threeElectricOutlet。 } 公共 のボイドconnectElectricCurrent(){ 場合(この instanceofはThreeElectricOutlet) twoElectricOutlet.connectElectricCurrent(); // TwoElectricOutletインターフェースが適応される IF(この instanceofのTwoElectricOutlet) threeElectricOutlet.connectElectricCurrent(); // threeElectricOutletインターフェースが適合されています } }
Adapterパターンは利益をもたらします
-
ターゲットクラスと切り離さフィッタのクラスは、元の構造を変更することなく、いずれかを導入することによって、既存のフィッタアダプタクラスクラスを再使用します。
-
クラスの透明性と再利用性を増加させる、フィッタクラスにカプセル化された特定のサービスの実装プロセスは、クライアントクラスは透明ですが、また、フィッタの再利用性を向上させ、同じ適応クラスは、異なる複数のシステムによって多重化されてもよいです。
-
柔軟性とスケーラビリティは、設定ファイルを使用することによって、あなたは簡単にアダプターを交換することができ、アダプタはまた、元のコードを変更していないに基づいて新しいカテゴリを追加することができ、それはに沿って完全にあり、非常に優れている「開閉の原則。」
ポリモーフィズム
インターフェース多型を用いて、それぞれ、三穴ソケットを使用して、2つの二重出口コレクタを使用して:ThreeElectricOutletとTwoElectricOutlet
パッケージ
全ての方法は、コードパブリック(すべての可視のクラス)、デフォルトのような電気変数名であり、すなわち、本パッケージがアクセスすることができます。パッケージを実装されていません。私たちは、例えば、以下の梱包方法を機械を洗浄することができます。
クラス洗浄用具 ThreeElectricOutlet { // 三相出口用いて洗濯機 プライベート文字列名を、 パブリック文字列のgetName(){ 戻り名。 } パブリックウォッシュ(){ 名前 =「黄河洗濯機」。 } 公共ウォッシュ(文字列名){ この .nameの= 名前。 } 公共 のボイドconnectElectricCurrent(){ ターン(); } 公共 のボイドターン(){ System.out.println(名前 + "洗濯を開始します。" ); } }
変数の保護を実現するために。セキュリティコードを強化。
結合および凝集の程度
コードはアダプタモードの意味を理解するために主にある、それは比較的簡単です。
結束のために、コードは、それが特に明白ではない反映し、2つのアプライアンスが特定の機能を実現するために一緒に働いていない、比較的簡単です。
カップリングのために、第一の結合の程度が低減されるように、インターフェースの使用です。
次に、アダプターの導入は、ターゲットクラスとフィッタとの間の結合を低減します。モジュール間のリンクが簡単になります。フィッタの変更、修正アダプタ場合は、ターゲット・クラスは影響を受けません。
操作の展開
テストコード
パッケージcom.AdapterPatternを。 パブリック クラスBiApplication { パブリック 静的 ボイドメイン(文字列[]引数){ ThreeElectricOutlet ThreeElectricOutlet; // ThreeElectricOutletインターフェース(三相出口 TwoElectricOutlet twoElectricOutlet; // TwoElectricOutletインターフェース(二相出口) ウォッシュウォッシュ= 新しい新しい洗浄(); // 洗濯機 TV = TV 新しい新しい TV(); // TV ThreeAndTwoElectricAdapterアダプタ= 新しい新 ThreeAndTwoElectricAdapter(ウォッシュ、TV); // 方法アダプタ threeElectricOutlet =アダプタ; // ソケット相に差し込まアダプタ のSystem.out.println( "三相電源コンセント:" ); threeElectricOutlet.connectElectricCurrent(); twoElectricOutlet =アダプタ; // アダプタは、二相コンセントに接続 するSystem.out.println(「二相電源ソケット」)。 twoElectricOutlet.connectElectricCurrent(); } }
送信元アドレス:
https://github.com/androidwolf/designpattern--adapter