• ベストアンサー

デザインパターン: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");の部分の具体的な説明が できる方、いらっしゃいますでしょうか? 教えて下さい。 よろしくお願いします。

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

  • ベストアンサー
  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.3

確かにこのような短い例では、 「なぜ、わざわざこんなことするんだ?」 になりますね。 Adapterパターンは、既に存在するクラス間(インターフェースも含む)での連結をするために使います。 例題だと、PrintインターフェースとBannerクラスは既に存在していて、BannerクラスをPrintインターフェースで使いたいために、PrintBannerクラスを作ったということです。 具体例をあげましょう。 社員データがファイルにあったとします。 これを読み込みました。 1社員の情報は、社員クラスに格納し、それをArrayListに詰め込みました。 画面に表示するために、JTable(表計算のような表示ができる)を使うことにしました。 JTableは表示内容を、TableModelというインターフェースで要求します。 つまり、JTableは「R行C列目の内容は?」と聞いてきます。 このままでは表示できないため、社員クラスをTableModelに変換するAdapterクラスを作ります。 つまり、R行C列目という問いに対し、 リストのR番目のうち、Cが 0なら社員番号、1なら名前、2なら住所 のように変換をしてあげます。 これで、社員データをJTableに表示することができます。 どうでしょうか?

saya129
質問者

お礼

ngsvxさん、わかりやすい例をあげていただき、 ありがとうございました!

その他の回答 (2)

  • kacchann
  • ベストアンサー率58% (347/594)
回答No.2

>Print p = new PrintBanner("Hello World"); >という部分がありますが、書籍の解説では >「PrintBannerのインスタンスをPrintインターフェース型の変数に代入していることに注意して下さい。」 >と書かれています 書籍のこの記述は単に 「Bannerクラスはそのままでは Print型として取り扱えなかったが、 BannarPrintクラスというものを作ったおかげで、 Print型でも扱えるようになった」 という意味。 (※adapterパターンの適用目的を言っているだけ)

saya129
質問者

お礼

kacchannさん、どうもありがとうございました!

回答No.1

おつかれさまです。 簡単に言うと、Printクラスをインプリメントしているサブクラスは、Main.main()メソッドを使用してprintWeak(); やp.printStrong(); を処理できると言うことです。 PrintBanner に代入するようにコーディングしてしまうと、PrintBanner 専用のMain.main()となってしまい、Printクラスをインプリメントする必要がなくなってしまいます。 Adapterパターンを勉強する前にまずFactoryパターンやTempleteパターンを勉強してみてはどうでしょうか? その方が、クラスをインプリメントする意味を理解することが容易に出来ると思います。

saya129
質問者

お礼

takataka111さん、お疲れさまです! さっそくFactoryとTempleteパターンを勉強しました! よ~く理解できました(笑) どうもありがとうございます!

関連するQ&A

専門家に質問してみよう