@634

Adapter パターン

Advertisement

クラスの橋渡し

クラスのインタフェースを変更したいが、クラスそのものは変更したくない場合や、互換性のないクラスに関係を持たせたい場合に有効。継承、もしくは委譲を使用してアダプタクラスを作成する。

特徴

異なる環境に対応させるために、仲介者を用意する。

(例)外部とのインタフェースがUSBだけのパソコンで、PS/2のマウスを使用したい。そこで変換用コネクタを使用する。

外部とのインタフェースがUSBだけのパソコン
class UsbComputer{
    useUsb(){}
}

変換用コネクタ(仲介者)。PS/2マウスを使用する。
class Connecter extends UsbComputer{
    usePS2(){
        super.useUsb();
    }
}

サンプルコード

既存のクラス
class RectInfo{
    private int width;
    private int height;

    // 幅と高さを設定
    public RectInfo(int w, int h){
        width  = w;
        height = h;
    }

    // 幅を返す
    public int getWidth(){
        return width;
    }

    // 高さを返す
    public int getHeight(){
        return height;
    }
}

アダプタクラス
class RectInfoAdapter{
    private RectInfo rectinfo;

    public RectInfoAdapter(RectInfo rectinfo){
        this.rectinfo = rectinfo;
    }

    // 幅を返す。処理自体は委譲する。
    public int getYoko(){
        return rectinfo.getWidth();
    }

    // 高さを返す。処理自体は委譲する。
    public int getTakasa(){
        return rectinfo.getHeight();
    }
}

Main
public class Main{
    public static void main(String args[]){

        // 既存のクラスを生成する
        RectInfo rInfo = new RectInfo(100, 50);

        // アダプタクラスを生成する
        RectInfoAdapter rAdapter = new RectInfoAdapter(rInfo);

        // 既存のクラスのメソッドを使用する
        System.out.println("rInfo.getWidth()     : " + rAdapter.getWidth());
        System.out.println("rInfo.getHeight()    : " + rAdapter.getHeight());

        // アダプタクラスのメソッドを使用する
        System.out.println("rAdapter.getYoko()   : " + rAdapter.getYoko());
        System.out.println("rAdapter.getTakasa() : " + rAdapter.getTakasa());
    }
}
実行結果
rInfo.getWidth()     : 100
rInfo.getHeight()    : 50
rAdapter.getYoko()   : 100
rAdapter.getTakasa() : 50

クラス図

Adapter

Advertisement

ショートカット

634
634ブログ
このカテゴリのトップページに戻る
Incubator(Pukiwiki)
634ラボ
   UIコレクションギャラリー
   ZO-3ジェネレーター

サイト検索


Y!ログール