2. Adapterパターン 2
- 2012/04/26 一部修正しました
2.3 サンプルケース2(委譲を利用した Adapter パターン)
サンプルケース1のように継承を利用した Adapter パターンを利用すれば、うまくインタフェースの違いを埋めることができました。しかし、何らかの理由で継承を利用した Adapter パターンが利用できないことが考えられます。例えば、前ページの図で Target がインタフェースではなく、抽象クラスとして宣言されている場合を考えて見ましょう。この場合、Adapter クラスは、Target クラスを implements することができないため、extends する必要が出てきます。Target 抽象クラスと Adaptee クラスの両方を継承する必要が出てきます。これは、java では多重継承が許されないという制約に引っかかってしまいます。
Adaptee クラスが final で宣言されている場合も Adapter クラスで Adaptee クラスを継承することができません。
このような場合は、委譲を利用した Adapter パターンを利用して見ましょう。委譲を利用する Adapter パターンのクラス図は、一般的に下記のようになります。
(実習課題2)
サンプルケース1で、太郎君がどうしても Chairperson インタフェースを実装したくないと言い張った場合のことを考えましょう。あなたは、太郎君と仲の良い花子さんに学級代表になってもらうことにしました。先生の狙いは、花子さんが、 Taro クラスの enjoyWithClassmate メソッドをうまく呼び出すことでクラスをまとめていくというものです。この際、学級代表は花子さんなので、花子さんが Chairperson インタフェースを実装することになります。委譲を利用した Adapter パターンの Adapter の役割を果たすクラスとして Hanako クラスを作成しなさい。
また、この際 Teacher クラスはどのようになるでしょう。
実習課題2の回答例
public class Hanako implements Chairperson{ private Taro taro; public Hanako(){ taro = new Taro(); } public void organizeClass(){ taro.enjoyWithAllClassmate(); } }
public class Teacher{ public static void main(String args[]){ Chairperson chairperson = new Hanako(); chairperson.organizeClass(); } }
これで太郎君の「みんなで楽しめる能力」をうまく利用することができるようになりましたね。
2.4 Adapterパターン まとめ
Adapter パターンは利用したいインタフェースを強制的に変えたいような場合に利用するとよいでしょう。
Adapter パターンの実現方法は2つあり、継承を利用したものと委譲を利用したものです。それぞれのクラス図は、一般的に以下のようになります。