适配器模式表示 "将一个类的接口转换成客户希望的另一个接口"

换句话说,使用不同接口的类时,根据客户需求提供接口。

适配器模式也称为 包装器(Wrapper)

适配器模式的优点

  • 允许两个或更多以前不兼容的对象进行交互。
  • 允许重用现有功能。

适配器模式的使用:

适用于以下情况:

  • 当一个对象需要利用具有不兼容接口的现有类时。
  • 当你想创建一个可重用的类,该类与具有不兼容接口的类协作时。
  • 当你想创建一个可重用的类,该类与具有不兼容接口的类协作时。

适配器模式示例

让我们通过上面的 UML 图来理解适配器设计模式的示例。

适配器模式的 UML:

适配器模式有以下规范:

  • 目标接口(Target Interface): 这是客户将使用的期望接口类。
  • 适配器类(Adapter class): 这是一个实现目标接口并修改 Adaptee 类提供的特定请求的包装类。
  • 被适配者类(Adaptee class): 适配器类使用此类来重用现有功能并为期望的用途进行修改。
  • 客户端(Client): 此类将与适配器类进行交互。

1-1.jpg

实现上述 UML:

步骤 1

创建一个 CreditCard 接口(目标接口)。

public interface CreditCard {
    public void giveBankDetails();
    public String getCreditCard();
}

步骤 2

创建一个 BankDetails 类(被适配者类)。

文件:BankDetails.java

public class BankDetails {
    private String bankName;
    private String accHolderName;
    private long accNumber;

    public String getBankName() {
        return bankName;
    }

    public void setBankName(String bankName) {
        this.bankName = bankName;
    }

    public String getAccHolderName() {
        return accHolderName;
    }

    public void setAccHolderName(String accHolderName) {
        this.accHolderName = accHolderName;
    }

    public long getAccNumber() {
        return accNumber;
    }

    public void setAccNumber(long accNumber) {
        this.accNumber = accNumber;
    }
}

步骤 3

创建一个 BankCustomer 类(适配器类)。

文件:BankCustomer.java

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class BankCustomer extends BankDetails implements CreditCard {
    public void giveBankDetails() {
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

            System.out.print("Enter the account holder name :");
            String customername = br.readLine();
            System.out.print("\n");

            System.out.print("Enter the account number:");
            long accno = Long.parseLong(br.readLine());
            System.out.print("\n");

            System.out.print("Enter the bank name :");
            String bankname = br.readLine();

            setAccHolderName(customername);
            setAccNumber(accno);
            setBankName(bankname);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public String getCreditCard() {
        long accno = getAccNumber();
        String accholdername = getAccHolderName();
        String bname = getBankName();

        return ("The Account number " + accno + " of " + accholdername + " in " + bname + 
                " bank is valid and authenticated for issuing the credit card.");
    }
}

步骤 4

创建一个 AdapterPatternDemo 类(客户端类)。

文件:AdapterPatternDemo.java

public class AdapterPatternDemo {
    public static void main(String args[]) {
        CreditCard targetInterface = new BankCustomer();
        targetInterface.giveBankDetails();
        System.out.print(targetInterface.getCreditCard());
    }
}

输出

Enter the account holder name :Sonoo Jaiswal

Enter the account number:10001

Enter the bank name :State Bank of India

The Account number 10001 of Sonoo Jaiswal in State Bank of India bank is valid  
and authenticated for issuing the credit card.

标签: Design Patterns, Design Patterns教程, 设计模式, 软件设计, 结构型模式, 行为型模式, 单例模式, 工厂模式, 观察者模式, 中介者模式, 访问者模式