Adapter(継承)

Adapterパターンは,求めているものと,提供されているものの違いを吸収して,求めているものに適合させるものである.

AdapterパターンはWrapperパターンと呼ばれることもある.すでにあるものを包み込んで,外見が異なるオブジェクトに変換してつかうような意味がある.これを実現する方法には2種類ある.クラスの関係を用いて「継承」を使ったものと,インスタンスを用いた「委譲」を使ったものがある.

「継承」を使ったパターンでは,元になる機能と,期待する機能の違いを吸収するためのクラスを定義して,そのクラスを介して機能を使う.

クラス構造(継承)


「アダプター」と聞いて,思い浮かぶものとして,電源を変換するためのアダプターがある.交流を直流に変えるものや,交流から直流に変えるアダプターなどがあるうち,交流の電圧を変えるアダプターを想定してクラスを作る.AC100インターフェイスは,AC100電圧を提供するコンセントのような役割をする.AC100outにて,100V電源を得ることができる.一方,提供されている電源は,AC220クラスのように,AC220outメソッドが返す220[V]である.これを変換するのがAdapter200to100クラスである.

プログラム(継承)

AC100クラスでは,100[V]が得られることだけが決まっている抽象メソッドが定義されている.100[V]を出力するメソッドが定義されている.

public interface AC100
{
   public abstract int AC100out();
}

AC220 クラスでは,220[V]が得られる.220[V]を返すメソッドが定義されている.

public class AC220
{
    public int AC220out()
    {
        return 220;
    }
}

AC220クラスにおける220[V]出力を100[V]出力に変換する,Adapter220to100クラスを定義する.AC220クラスを継承して,AC100インターフェイスを実装している.

class Adapter220to100 extends AC220 implements AC100
{
    @Override
    public int AC100out()
    {
        return AC220out()/2 -10;
    }
}

定義したクラスを使って,220[V]を変換して,100[V]が得られている様子をMainクラスにて確認する.

public class Main
{
    public static void main(String args[])
    {
        AC100 ac100 = new Adapter220to100();
        System.out.println(ac100.AC100out() + "[V]出力");
    }
}

演習(継承)

(1)追加

フィジーに旅行に行くことを想定して,240[V]の電源があるときに,それを100[V]に変換して使うためのクラスを追加せよ. 追加したクラスをインスタンス化して,フィジーで問題なく100[V]が得られることを確認せよ.

Adapter(extends)