• ベストアンサー

Adapterデザインパターン

Adapterデザインパターンは、 継承を利用した実装パターンと、 委譲を利用した実装パターンがあると思います。 http://www.techscore.com/tech/DesignPattern/Adapter/Adapter1.html/ 「親クラスにバグがあって修正した場合、  必ず子クラスも再コンパイルしなければならない」 ということを考えると、 保守性は高いのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • hitomura
  • ベストアンサー率48% (325/664)
回答No.1

提示されたページを読みましたが、その中に > 「親クラスにバグがあって修正した場合、 > 必ず子クラスも再コンパイルしなければならない」 という記述は見つかりませんでした。 というか、この文、継承の弱点の一つですよね。 その弱点が気になるならば委譲を使った実装パターンを使えばいいだけのことです。

TeferiMage
質問者

お礼

ありがとうございます。 アダプタ機能の目的は、 インタフェースの差違を吸収するためと捉えていますが、 (1)1つの機能を、n種類のインタフェースでコールしたい場合 ⇒ 継承の方のパターンを使い、 オーバーロードで色んな形で呼べるようにする (2)n種類のクラスがそれぞれバラバラのインタフェースから、1つの機能をコールしたい場合 ⇒ 差違を吸収するためだけのクラスに委譲 というのがよいのかな?と感じました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • teketon
  • ベストアンサー率65% (141/215)
回答No.2

何を聞きたいのかよくわかりません。 以下のどちらかを聞いているのでしょうか? ・Adapterパターンは継承、移譲の2実装があるから保守性が高い ・Adapterパターンの継承、または移譲の実装はどちらかが保守性が高い 保守性とは何を指していますか? 何と何を比較していますか? この辺を明らかにしないとよくわからない質問と回答になると思います。

TeferiMage
質問者

お礼

ありがとうございます。 「アダプタクラスに不具合があったとき、そのアダプタクラスを使用しているクラスの再コンパイル」が発生しないことを 保守性が高い、 逆に再コンパイルが必要な場合、 保守性が低い、としたときに、 (1)継承で作ったアダプタクラスと、 (2)委譲で作ったアダプタクラスで、 どちらが保守性が高いか? を確認したいです。 委譲のパターンの方が保守性が高いと捉えていますが合っていますでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • デザインパターン?

    以下の例1のようなことと、 同じ親クラスを継承することなく(例2のような形で)、実現するのは、 何というデザインパターンでしょうか? //------------------------ ◆例1:普通の実装 //データ操作の抽象クラス Class DataManagementInterface virtual get_data(std::string) = 0 //データ操作(データベース) ※戻り値はデータテーブルクラス Class DBManagement : DataManagementInterface virtual data_table_class get_data(std::string) //データ操作(ファイル) ※戻り値はファイルクラス Class FileManagement : DataManagementInterface virtual file_class get_data(std::string) //------------------------ ◆例2:インタフェースを統合するようなイメージの実装 //データ操作(データベース) Class DBManagement virtual void* get_data(std::string) //データ操作(ファイル) Class FileManagement virtual get_data(std::string) Class DataManagementInterface virtual get_data(std::string, int 操作区分) get_dataの実装    if 操作区分が1なら、       DBManagementのget_data    else if       操作区分が2なら、FileManagementのget_data //------------------------ また、ちなみにですが、 後者の方法で、戻り値が不定(データテーブルクラスか、ファイルクラスを返す) ことは不可能という認識ですが、「できない」で合ってますか? .

  • Iteratorパターンの亊で、質問します。

    Iteratorパターンの亊で、質問します。 いつもお世話になっています。 http://www.techscore.com/tech/DesignPattern/Iterator.html#dp1-2, http://www.techscore.com/tech/DesignPattern/Iterator2.htmlを参考にしたのですが、 このとき、Mainクラスを実行してもなにも表示されません。 それで、直してみました。 おそらく、原因は、StudentListクラスのaddメソッドだと思ったのですが、 変更した、StudentListクラス、、、 public class StudentList { protected Student[] students; private int last = 0; public StudentList(int studentCount) { this.students = new Student[studentCount]; } public void add(Student student) { System.out.println("student --"); System.out.println(student.getName() ); //ここに原因がある。。。 students[last] = student; //追加... last++; } public Student getStudentAt(int index) { return students[index]; } public int getLastNum() { return last; } 実行にあたり、使用したクラスなどは、 Student,StudentList,Teacher,Main、です。 また、他にも、方法があるというのですが、 どんなのがあるかよくわかりません。 なんらかのヒントをもらえないでしょうか? http://okwave.jp/qa/q5886678.htmlの問い、と被るのですが、 DBの接続、データ取得の汎用的な処理をDB接続用のクラスにもたせて、 具体的な取得方法など別に用意して、そのクラスに渡すというやりかたです。 この場合の考えかたを、Iteratorで考えるのはどうなのでしょうか? このやり方だと、仮に、Teacherインターフェースに追加されると、 MyTeacherクラスにも追加が要求され、手間がかかる。 この場合、もっとも汎用性があるソースとはどんなのなのでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • Javaデザインパターンハンドブック(ソフトバンク)2005年発行を読

    Javaデザインパターンハンドブック(ソフトバンク)2005年発行を読んでいます。 その中で疑問に思うところがあります。よろしくお願いします。 adapterパターンのサンプルで、 既存のクラスDebugPrintを利用するため、 (1)利用者Clientに提供するインタフェースILogWriter作成 (2)新たにクラスLogWriter作成(ILogWriter実装) があります。 DebugPrintの機能を少し変えて利用しようというのがこのパターンの目的です。 コードは以下のようになっています(一部省略しています)。 public class DebugPrint { private String prefix; /** * 出力するログの接頭辞を指定する。 * * @param _prefix ログの接頭辞 */ public void setPrefix(String _prefix) { prefix = _prefix; } /** * ログを出力する。 * * @param message */ public void print(String message) { System.out.println(prefix + message); } } public interface ILogWriter { /** * 文字列で表現したログを接頭辞をつけて出力する。 * * @param prefix 接頭辞 * @param message 出力するログ * @throws Exception ログ出力時に不具合が発生した場合 */ public void log(String prefix, String message) throws Exception; } /** * Adapterクラス。 * ログをコンソールに出力するクラス。 * 既存のDebugPrintクラスを再利用する。 * */ public class LogWriter implements ILogWriter { /** Adapteeへの参照 */ protected DebugPrint adaptee1; public LogWriter() { adaptee1 = new DebugPrint(); } public void log(String prefix, String message) throws Exception { // Adapteeに委譲する adaptee1.setPrefix(prefix); adaptee1.print(message); } } public class Client { public static void main(String[] args) throws Exception { ILogWriter log = new LogWriter(); // <---この行 log.log("[INFO]", "XMLを編集するサンプル"); } } ここで、 Clientクラスでの ILogWriter log = new LogWriter(); の宣言を LogWriter log = new LogWriter(); に変更しても動作します。 (1) Clientでのlogの宣言をILogWriterにするかLogWriterにするかでメリデメはありますか? (2) ILogWriterインタフェースは定義しないで、LogWriterクラスを定義して、ClientからLogWriterクラス経由でDebugPrintクラスのlogを使うようにもできます(インタフェースILogWriterを定義しない)。こうすると、デザインパターンから崩れてしまいますが、こうした場合のデメリットはなんでしょうか?

    • ベストアンサー
    • Java
  • Strategyパターンを用いた実装について

    Strategyパターンを用いた実装について 現在Javaを勉強しており、 Strategyパターンを用いた以下の実装を考えています。 public class UseStrategy { private Strategy strategy; public void doSomthing(int num) { switch (num) { case 0: strategy = new AlphaStrategy(); break; case 1: strategy = new BetaStrategy(); break; case 2: strategy = new GammaStrategy(); break; } // 変数strategyを用いて処理を続行していく // ... } private interface Strategy { public abstract void method_1(); public abstract void method_2(); } private class AlphaStrategy implements Strategy { @Override public void method_1() { //do something } @Override public void method_2() { //do something } } private class BetaStrategy implements Strategy { @Override public void method_1() { //do something } @Override public void method_2() { //do something } } private class GammaStrategy implements Strategy { @Override public void method_1() { //do something } @Override public void method_2() { //do something } } } つきましては、以下ご質問させてください。 (1)Strategyパターンの実装において、  上記UseStrayegyクラスのように、あるクラスの入れ子クラスとして  Strategyインターフェース及び、その実装クラスを実装する方法は  普通でしょうか?    それとも、入れ子クラスとしてではなく、Strategyインターフェース、  その実装クラスを全て 別クラスファイルに分けた方が良いのでしょうか? (2)例として、  BetaStrategy.method_2()とGammaStrategy.method_2()の処理が全く  同じだったとします。その場合、共通となる処理を一つのメソッド化し、  そのメソッドをBetaStrategy.method_2()とGammaStrategy.method_2()から  コールしたいと考えております。  その際、共通となる処理メソッドの実装箇所としては、以下のいずれが良いのでしょうか。   (A)Strategyインターフェースを抽象クラス化し、二つの共通処理メソッドを実装する。  (B)UseStrategyクラスに、共通処理を実装する。    それとも、上記の様なケースがある場合Strategyパターンは不適切でしょうか。 文面に分かりづらい面や、Javaのオブジェクト指向・デザインパターンについて 理解の乏しいところがあるかと思いますが、ご回答の程よろしくお願いいたします。

    • ベストアンサー
    • Java
  • JAVA:抽象クラスとインタフェースクラスの違い

    インタフェースクラスの存在意義がわかりません。 「処理の実体まで実装せず、箱だけ作っておく」という意味では、抽象クラスで良いのでは?と感じます。 (厳密には、インタフェースクラスの方は、継承せずに、複数の実装パターンを分けれるという部分に違いはあると思いますが、ほぼ存在意義がないように感じます。)

    • ベストアンサー
    • Java
  • 【C++】DLLの中身

    親クラス:ParentClassが、 メンバ m_a メソッド GetA SetA それを継承した子クラス:ChildClass が、 メンバ m_a ←オーバーライド m_b ←子クラスで追加 メソッド GetA ←オーバーライド SetA ←オーバーライド GetB ←子クラスで追加 SetB ←子クラスで追加 という構成で、それぞれ別のDLLを作成したとき、 以下のどちらになるでしょうか? 「(1)」の認識であり、必ず、子クラスは、親クラスのファイルサイズよりも大きくなるという認識です。 (1)「ChildClass.DLL」では、 コンパイル時の「ParentClass」の処理内容を内包している。 (※ChildClass.DLLのコンパイル時に、親クラスの処理も、記載されたような状態でDLLが作成される) (2) 「ChildClass.DLL」では、 コンパイル時の「ParentClass」の処理内容を内包せず、 実行時に、親クラスのDLLに委譲している。 また、「(1)」であるならば、 親クラスにバグがあって修正した場合、 必ず子クラスも再コンパイルしなければならない認識ですが合っていますでしょうか? /**************************************/ また、DLLがクラスX、クラスYで構成されているとき、 クラスXのobj と、 クラスYのobj と、 クラスXのlib (クラスYから、クラスXの処理を呼び出せるようにするために、クラスX側からpublic で実行できる関数のIN・OUTの仕様が記載されている) クラスYのlib が、含まれているという認識で良いのでしょうか? .   コンパイル時、libや、objができますが、これらはDLLに内包される

  • サブクラス型オブジェクトをスーパークラス方に代入

    ある所で下記のような継承についての記述をみつけました。 ----------------------------------------------------------------------------- 継承の目的は、あるクラスで実装したメソッドなどの機能を利用して、 さらに実装を追加する差分コーディングです。 一つのクラスから複数のサブクラスを作ることも良くあります。 このような時、それらのサブクラス型オブジェクトの参照を代入できる変数として、 スーパークラス型変数を使うことがしばしばあります。 ----------------------------------------------------------------------------- サブクラス型オブジェクトの参照を代入できる変数として、 スーパークラス型変数を使うことがある、と いうのはどういった場合に使うのでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Java
  • C# IDisposable の必要性について

    Visual Studio 2010 を使って C# の勉強をしています。 始めたばかりで質問がおかしかったらすみません。 IDisposable を継承する意味がわかっていません。 MSDN の(http://msdn.microsoft.com/ja-jp/library/fs2xkftw.aspx) 例: 基底クラスの Dispose の実装 にて、 DisposableResourceクラスが IDisposable を継承していますが、 IDisposable を継承する意味はあるのでしょうか? IDisposable がインタフェイスというのは理解していますが、 DisposableResourceクラス の中のpublic void Dispose() は IDisposable を継承しないでも かけるのではないか?と思っています。 恐らく自分の知識が何か抜けていると思うのですが、宜しくお願いします。

  • デザインパターン:Adapterパターンで

    書籍でAdapterパターンを学習しているのですが、 一箇所、どうしてこうなるのかわからないところがあります。 Printインターフェース public interface Print { public abstract void printWeak(); public abstract void printStrong(); } Bannerクラス public class Banner { private String string; public Banner(String string){ this.string = string; } public void showWithParen(){ System.out.println("showWithParen:" + string + "★"); } public void showWithAster(){ System.out.println("showWithAster:" + string + "☆"); } } PrintBannerクラス public class PrintBanner extends Banner implements Print { public PrintBanner(String string) { super(string); } public void printWeak() { showWithParen(); } public void printStrong() { showWithAster(); } } Mainクラス public class Main { public static void main(String[] args) { Print p = new PrintBanner("Hello World"); // PrintBanner p = new PrintBanner("Hello World"); p.printWeak(); p.printStrong(); } } Mainクラスの部分で、 Print p = new PrintBanner("Hello World"); という部分がありますが、書籍の解説では 「PrintBannerのインスタンスをPrintインターフェース型の変数に代入していることに注意して下さい。」 と書かれています。が、意味がよくわかりません・・・。 ちなみに、 PrintBanner p = new PrintBanner("Hello World"); でも出力結果は同じです。 Print p = new PrintBanner("Hello World");の部分の具体的な説明が できる方、いらっしゃいますでしょうか? 教えて下さい。 よろしくお願いします。

    • ベストアンサー
    • Java
  • x86用Sun Studio12におけるコンパイラのバグでしょうか?

    今、x86用Solaris10にStudio12をインストールして、C++のプログラムを作ったのですが、仮想継承を定義すると正常な動作をしません。 調べたところ、どうやら基底クラスから継承している関数のポインタが基底クラスとそれを呼び出す派生クラスでずれてしまっていることが原因のようでした。 試しにsparc用Solaris10+Studio12でも同じプログラムを動作させ、調査したところ、こちらは上述の現象もなく、正常に動作しています。 これはx86用Studio12についているコンパイラのバグなのでしょうか? また、サポート契約なしに、このバグ報告をSunに行う方法がありましたら教えてください(サイト(http://jp.sun.com/)を見ましたが該当事象に対するパッチ及びバグ報告方法について記載が見つかりませんでした。 どなたかご教示いただけないでしょうか。