Design Patterns教程-适配器模式
![](https://wx.javatiku.cn/j/j301-t.jpg)
适配器模式表示 "将一个类的接口转换成客户希望的另一个接口"。
换句话说,使用不同接口的类时,根据客户需求提供接口。
适配器模式也称为 包装器(Wrapper)。
适配器模式的优点
- 允许两个或更多以前不兼容的对象进行交互。
- 允许重用现有功能。
适配器模式的使用:
适用于以下情况:
- 当一个对象需要利用具有不兼容接口的现有类时。
- 当你想创建一个可重用的类,该类与具有不兼容接口的类协作时。
- 当你想创建一个可重用的类,该类与具有不兼容接口的类协作时。
适配器模式示例
让我们通过上面的 UML 图来理解适配器设计模式的示例。
适配器模式的 UML:
适配器模式有以下规范:
- 目标接口(Target Interface): 这是客户将使用的期望接口类。
- 适配器类(Adapter class): 这是一个实现目标接口并修改 Adaptee 类提供的特定请求的包装类。
- 被适配者类(Adaptee class): 适配器类使用此类来重用现有功能并为期望的用途进行修改。
- 客户端(Client): 此类将与适配器类进行交互。
实现上述 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.