一般说来,一个类的客户对象通过类提供的接口来访问它的服务。有些时候,一个类可以提供客户对象需要的功能,但它的接口却不同于客户对象的期望。
在这种情况下,已有的接口就需要被转换为客户对象所期望的另一个接口,以保留已有类的可重用性。
类适配器:
类是适配器被设计为适配源类的一个子类的形式,除了继承子适配源类外,适配器类还实现客户对象所期望的接口。当客户对象它调用一个适配器方法的时候,适配器在内部调用它继承来的一个适配源方法。
实例:
验证给定客户地址的应用
代码:
import java.io.*;
import java.util.*;
class Customer {
public static final String US = "US";
public static final String CANADA = "Canada";
private String address;
private String name;
private String zip, state, type;
public boolean isValidAddress() {
//get an appropriate address validator
AddressValidator validator = getValidator(type);
//Polymorphic call to validate the address
return validator.isValidAddress(address, zip, state);
}
public Customer(String inp_name, String inp_address,
String inp_zip, String inp_state,
String inp_type) {
name = inp_name;
address = inp_address;
zip = inp_zip;
state = inp_state;
type = inp_type;
}
private AddressValidator getValidator(String custType) {
AddressValidator validator = null;
if (custType.equals(Customer.US)) {
validator = new USAddress();
}
if (type.equals(Customer.CANADA)) {
validator = new CAAddressAdapter();
}
return validator;
}
}// end of class
public interface AddressValidator {
public boolean isValidAddress(String inp_address,
String inp_zip, String inp_state);
}// end of class
import java.io.*;
import java.util.*;
class USAddress implements AddressValidator {
public boolean isValidAddress(String inp_address,
String inp_zip, String inp_state) {
if (inp_address.trim().length() < 10)
return false;
if (inp_zip.trim().length() < 5)
return false;
if (inp_zip.trim().length() > 10)
return false;
if (inp_state.trim().length() != 2)
return false;
return true;
}
}// end of class
import java.io.*;
import java.util.*;
class CAAddress {
public boolean isValidCanadianAddr(String inp_address, //注意方法名
String inp_pcode, String inp_prvnc) {
if (inp_address.trim().length() < 15)
return false;
if (inp_pcode.trim().length() != 6)
return false;
if (inp_prvnc.trim().length() < 6)
return false;
return true;
}
}// end of class
import java.io.*;
import java.util.*;
public class CAAddressAdapter extends CAAddress
implements AddressValidator {
public boolean isValidAddress(String inp_address,
String inp_zip, String inp_state) {
return isValidCanadianAddr(inp_address, inp_zip,
inp_state);
}
}// end of class
对象适配器:
一个对象适配器拥有适配源对象的一个引用。与类适配器相似,对象适配器也实现客户对象期望的接口。