- ベストアンサー
Javaデザインパターンハンドブック読書の疑問: adapterパターンのログ出力における宣言のメリデメとデメリット
- Javaデザインパターンハンドブック(ソフトバンク)2005年発行を読んでいます。adapterパターンのサンプルで既存のクラスDebugPrintを利用するため、(1)利用者Clientに提供するインタフェースILogWriterの作成、(2)新たにクラスLogWriterの作成があります。logの宣言をILogWriterにするかLogWriterにするかでメリデメがあり、ILogWriterインタフェースを定義しない場合のデメリットについても考えています。
- メリデメについては、ILogWriterを使った場合はインタフェースを介することで、実装クラスを変更することなく異なるログ出力方法を利用できるメリットがあります。一方、LogWriterを使った場合は直接具体クラスを指定することで簡略化されますが、他のログ出力方法を利用する際には修正が必要になるデメリットがあります。
- ILogWriterインタフェースを定義しない場合のデメリットについては、デザインパターンから崩れてしまうため、柔軟性や拡張性に制限が生じる可能性があります。これにより、プログラムの変更やメンテナンスが困難になる可能性があるとされています。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
この例のクラス名・インターフェース名やクライアントコードが良くないので、分かりづらくなっていますが、 Adapter パターンの趣旨はインターフェースの異なるクラスを使用できるようにすることです。 この例でいうと下記の様なケースが考えられます。 1. ILogWriter とそれを使うコードが先に存在している。 2. それらとは別に DebugPrint も存在している。 3. ILogWriter の実装として DebugPrint を使いたいが、インターフェースが違う。 4. これらを解決するために DebugPrint を包んで ILogWriter を実装した LogWriter を作って使う。 つまり、ILogWriter に合わせる(実装する)必要が無いならば、そもそも Adapter パターンを使う必要は無いという事です。 言い換えれば、特定の型(この場合は ILogWriter )を付加することが目的のパターンですので、ILogWriterを定義しない・使わない場合との比較には意味が有りません。 下記の様に ILogWriter だけを使っているクラスを一つ追加して考えると分かりやすいかもしれません。 ------------------------------------------- /** * ILogWriter を使用するクラス。 * LogWriter や Client よりも前から存在していて、 * すでにあちこちで使われていると思ってください。 */ public class WriterUser { private ILogWriter writer; public WriterUser(ILogWriter writer) { this.writer = writer; } public void execute() throws Exception { // ・ // ・ // ・ writer.log("~~~", "~~~~~"); } } /** * クライアントコードでは WriterUser を使いたい場合を想定して下さい。 */ public class Client { public static void main(String[] args) throws Exception { final WriterUser writerUser = new WriterUser(new LogWriter()); writerUser.execute(); } } ------------------------------------------- ちなみにデザインパターンについては下記の本も参考になると思います。 ■ Java言語で学ぶデザインパターン入門 http://www.amazon.co.jp/dp/4797327030/ ■ デザインパターンとともに学ぶオブジェクト指向のこころ http://www.amazon.co.jp/dp/4894716844/
お礼
私の疑問がそもそも的外れだということはよく分かりました。 本を読み直すと、「現在、ログを出力するためのILogWriterインタフェースが規定されており、このインタフェースに従ったクラスを実装しようとしています。」とありました。 ILogWriterインタフェースを実装するLogWriterクラスを作りたかったわけです。 そのとき、既存のDebugPrintクラスをそのまま使いたかったのです。 言い換えると、DebugPrintクラスを使って、LogWriterクラスを作ることがAdapterパターンと思われます。 なんだか、わざわざAdapterパターンというほど大げさなものではないような気がします。 まだまだ、Adapterパターンの本質に迫れていないようです。ご紹介していただいた本も読まなければならないのかと思います。