小さなケーススタディ
1、機能要件:
例えば電源アダプタ、へ。
ちょうどバッテリーを使い果たしホテルで海外に住んでいる外国人旅行に人、(携帯電話は2穴のプラグである)が、唯一の3穴ソケット外国のホテル、乗客のために一般的に不可能なホテルでは、2穴3穴のコンセントを交換します、このアダプターが便利になると、プラグは、要件を満たすために、二つの穴と3ピンプラグに変わります。
2.アダプタモードとは何ですか。
アダプタモードは、構造的なデザインパターンです。思考のアダプタパターンは次のとおりです。不一致のインターフェイスの一緒に働くことができないので、2つのクラスが、もともと一緒に仕事ができるように、クライアントが別のインターフェイスを期待するように、クラスのインターフェイスを変換します。
3、Adapterパターンの分類
アダプタモード(1)
(2)オブジェクトアダプタモード
(3)インタフェースアダプタモード
図4に示すように、アダプタパターンの役割:
(1)ソース(Adaptee):オブジェクトの種類または二つの穴は、プラグに対応して、適合させる必要があります。
(2)アダプター(アダプター):中間接続対象物源、アダプタプラグに対応します。
(3)ターゲット(目標):目標は、3ピンのプラグと同等のものを得ることを楽しみにして。
第二に、アダプタモード
1、クラスアダプタパターンの実装の場合:
(1)アダプタオブジェクトは、元のクラス(例えば、三孔プラグ)を継承します。
(2)新しいアダプタインタフェースの実装(例えば、2穴プラグのような)対象物の組み合わせ。
(3)アダプタインスタンスを呼び出し元のメソッドは、新しいインタフェースメソッドに委託されています。その方法は、新しいインターフェイスの元のクラスにメソッドを呼び出します。(2穴プラグは、3ピンプラグを呼び出すことができる)、
(4)コードを達成します。
パッケージadapter.pattern.demo1; / ** *テストクラス、テストクラスアダプタモード * / パブリック クラスClassAdapterDemo { 公共 静的 ボイドメイン(文字列[]引数){ アダプタアダプタ = 新しい新しいアダプタ(); adapter.show2(); } } / ** * 3ピンプラグ(元のクラス) * * / クラスThreeHolePlug { 公共 ボイドshow1(){ System.out.printlnは( "3ピンプラグ" ); } } / ** * 2穴プラグ(新しい要件) * / インターフェースDoubleHolePlug { 公共 ボイドShow2(); } / ** *元のクラスの継承、および書き換えのための新しいインターフェース、インターフェースメソッドを実装し、元のクラスのメソッドを呼び出します。 * * / クラスアダプタ延び ThreeHolePlug 実装DoubleHolePlug { @Override 公共 ボイドShow2(){ show1を(); } }
(5)解析コード:
クラスはいくつかの制限がありますように、達成するために継承を使用。しかし、あなたは元のクラスまたはオンデマンドで書き換える方法を得ることができます。
(6)UMLダイアグラム。
図2に示すように、オブジェクトアダプタパターンの実装ケース
(1)オリジナルのオブジェクト・クラスの内部アダプタ・オブジェクト・インスタンスを有します。(すなわち、3つの穴ソケットオブジェクト)
(2)新しいアダプタインタフェース(例えば、2穴プラグ)の実装のために対象物の組み合わせ。
(3)アダプタインスタンスを呼び出し元のメソッドは、新しいインタフェースメソッドに委託されています。その方法は、新しいインターフェイスの元のクラスにメソッドを呼び出します。(2穴プラグは、3ピンプラグを呼び出すことができる)、
(4)コードを達成します。
パッケージadapter.pattern.demo2; / ** *テスト・クラス・オブジェクト・アダプタ・テスト・モード * / パブリック クラスObjectAdapterDemo { 公共 静的 ボイドメイン(文字列[]引数){ アダプタアダプタ = 新しい新しいアダプタ(新しい新しいThreeHolePlug()); adapter.show2 (); } } / ** * 3ピンプラグ(元のクラス) * * / クラスThreeHolePlug { 公共 ボイドshow1(){ System.out.printlnは( "3ピンプラグ" ); } } / ** *二つの穴(新しい要件を)プラグ * / インタフェースDoubleHolePlug { 公共 ボイドShow2(); } / ** *新しいインタフェースの元のメソッドを呼び出すためにオブジェクト・クラスをインスタンス化することによってアダプタに元のクラスのインスタンスオブジェクトの書き換えのインターフェイスメソッドを実装。 * * / クラスアダプタ実装DoubleHolePlug { ThreeHolePlug threeHolePlug; / ** *コンストラクタ、元の着信アダプタのオブジェクト・クラスのインスタンス * * @param threeHolePlug オリジナル*のオブジェクト・クラスのインスタンス * / パブリックアダプタ(ThreeHolePlug threeHolePlug){ この = .threeHolePlug threeHolePlug; } @Override 公共 ボイド Show2(){ threeHolePlug.show1(); } }
(5)コードの分析:
このコードは、代わりに継承原理に従って合成多重の、重合は、継承の制限を減少させず、もはやインタフェースは新しい要件でなければならない必要です。
(6)UMLダイアグラム。
3、インタフェースアダプタモード(デフォルトのアダプタモード):
(1)このクラスを達成するために、あまりにも抽象インタフェース・メソッドは非友好的な、すべてのメソッドを実装する必要がありますとき。抽象クラスは、すべてのメソッド(ヌル法のように書き換えること)を書き換え、インタフェースを達成するために使用されてもよいです。所望に応じて、この時点で、抽象クラスの継承、及びオーバーライドされたメソッドを選択することができます。
(2)インタフェースの使用に適用されますが、シナリオ・インターフェースにすべてのメソッドを書き換える必要はありません。
(3)コードの実装:
パッケージadapter.pattern.demo3; / ** *テストクラス・インタフェース・アダプタ・テスト・モード * / パブリック クラスInterfaceAdapterDemo { 公共の 静的な 無効メイン(文字列[] args)を{ // 自分のニーズに応じて、書き換え関連の方法は、すべての必要はありません書き換え 新しい新しいMoveApapter(){ @Override 公共 ボイドアップ(){ System.out.printlnは( "上方移動" ); } } .UP(); 新しい新しいMoveApapter(){ @Override 公共 ボイドダウン(){ のSystem.out .println(「下降」)。 } } .Down(); } } / ** *抽象メソッドを複数含むインタフェース * * / 界面移動{ 無効)(アップ、 無効(下); ボイド左(); ボイド右(); } / ** *抽象インタフェースを実装するクラス、およびすべての空の方法書き換え方法 * * / 抽象 クラスを MoveApapter 実装移動{ @Override 公共 ボイドアップ(){ } @Override 公共 ボイドダウン(){ } @Override 公共 ボイド左(){ } @Override 公共 ボイド右(){ } }
(4)UMLダイアグラム。