アダプターパターン

📢 この記事は gemini-2.5-flash によって翻訳されました

Adapter Pattern クラス構造パターン/オブジェクト構造パターン

目的

あるクラスのインターフェースを、クライアントが望む別のインターフェースに変換するんだ。アダプターパターンを使うと、インターフェースが合わなくて一緒に動かせなかったクラス同士も一緒に使えるようになるんだ。

構造

  1. クラスアダプターは多重継承を使って、あるインターフェースを別のインターフェースに合わせるよ。

image

  1. オブジェクトアダプターはオブジェクトの合成に依存してるんだ。

image

内訳はこれだね:

  • Targetは、Clientが使う特定分野に関するインターフェースを定義するよ。
  • Clientは、Targetインターフェースに準拠するオブジェクトと一緒に動くんだ。
  • Adapteeは、すでに存在するインターフェースを定義するんだけど、これがアダプト(適応)される必要があるんだ。
  • Adapterは、AdapteeのインターフェースとTargetインターフェースを適応させるんだ。

適用性

アダプターパターンは、こんな時に役立つよ:

  • 既存のクラスを使いたいけど、そのインターフェースが要件に合わない場合。
  • 再利用可能なクラスを作りたいんだけど、それが他の無関係なクラスや予期しないクラス(つまり、インターフェースが互換性がないかもしれないクラス)と一緒に動く必要がある場合。
  • (オブジェクトアダプターにのみ適用)既存のサブクラスを使いたいけど、それぞれのインターフェースに合わせるためにすべてをサブクラス化するのは無理な場合。オブジェクトアダプターなら、その親クラスのインターフェースを適応させられるんだ。

例 1

あるソフトウェアシステムで、住所情報を表示するためのAddressクラスがすでに設計・実装されてるんだけど、今度はオランダ語ベースの住所情報表示インターフェースが必要になったんだ。この要求を満たすため、そして将来的に新しい言語インターフェースが出てくる可能性も考慮して、アダプターパターンを使ってこの要求を実装することにしたよ。クラス図はこれね。

适配器模式-例子

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
public class Adapter {
    public static void main(String[] args) {
        Address address = new Address();
        DutchAddress dutchAddress = new DutchAddressAdapter(address);
        System.out.println("The DutchAddress");
        test(dutchAddress);
    }
    
    static void test(DutchAddress dutchAddress){
        dutchAddress.plaats();
        dutchAddress.postcode();
        dutchAddress.straat();
    }
}

class Address{
    public void street(){/* code omission */}
    public void zip(){/* code omission */}
    public void city(){/* code omission */}
}

class DutchAddress{
    public void straat(){/* code omission */}
    public void postcode(){/* code omission */}
    public void plaats(){/* code omission */}
}

class DutchAddressAdapter extends DutchAddress{
    private Address address;
    public DutchAddressAdapter(Address address){
        this.address=address;
    }

    @Override
    public void straat() {
        address.street();
    }

    @Override
    public void postcode() {
        address.zip();
    }

    @Override
    public void plaats() {
        address.city();
    }
}

例 2

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// Javaは多重継承をサポートしてないから、以下はオブジェクトアダプターだよ
public class main{
     public static void main(String[] args) {
        Target target = new Adapter();
        target.Request();
    }
}

class Target{
    public void Request(){
        System.out.println("hello");
    }
}

class Adapter extends Target{
    private Adaptee a = new Adaptee();

    @Override
    public void Request(){
        a.SpecificRequest();
    }
}

class Adaptee{
    public void SpecificRequest(){
        System.out.println("hi");
    }
}

Visits Since 2025-02-28

Hugo で構築されています。 | テーマ StackJimmy によって設計されています。