Home 适配器模式
Post
Cancel

适配器模式

Adapter Pattern 类结构型模式/对象结构型模式

意图

将一个类的接口转换成客户希望的另外一个接口。Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作

结构

  1. 类适配器使用多重继承对一个接口与另一个接口进行匹配

  1. 对象适配器依赖于对象组合

其中:

  • Target 定义 Client 使用的与特定领域相关的接口
  • Client 与符合 Target 接口的对象协同
  • Adaptee 定义一个已经存在的接口,这个接口需要适配
  • Adapter 对 Adaptee 的接口与 Target 接口进行适配

适用性

Adapter 模式适用于:

  • 想使用一个已经存在的类,而它的接口不符合要求
  • 想创建一个可以服用的类,该类可以与其他不相关的类或不可预见的类 (即那些接口可能不一定兼容的类) 协同工作
  • (仅适用于对象 Adapter) 想使用一个已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口

例子 1

某软件系统中,已设计并实现了用于显示地址信息的类 Address ,现要求提供基于 Dutch 语言的地址信息显示接口。为了实现该要求并考虑到以后可能还会出现新的语言接口,决定采用适配器模式实现该要求,类图如下

适配器模式-例子

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
49
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");
    }
}
This post is licensed under CC BY 4.0 by the author.

使用 CNAME 将域名重定向到带路径的 URL

桥接模式