Figure 20.1: Customer Class Listing 20.1: Customer Class
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() { … … } 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; } }//end of class
不同的客戶對象創建Customer對象并調用(invoke)isValidAddress方法驗證客戶地址的有效性。為了驗證客戶地址的有效性,Customer類期望利用一個地址驗證類(address validator class),這個驗證類提供了在接口AddressValidator中聲明的接口。 Listing 20.2: AddressValidator as an Interface
public interface AddressValidator { public boolean isValidAddress(String inp_address, String inp_zip, String inp_state); }//end of class
讓我們定義一個USAddress的驗證類,來驗證給定的U.S地址。 Listing 20.3: USAddress Class
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
USAddress類實現AddressValidator接口,因此Customer對象使用USAddress實例作為驗證客戶地址過程的一部分是沒有任何問題的。 Listing 20.4: Customer Class Using the USAddress Class
class Customer { … … public boolean isValidAddress() { //get an appropriate address validator AddressValidator validator = getValidator(type); //Polymorphic call to validate the address return validator.isValidAddress(address, zip, state); } private AddressValidator getValidator(String custType) { AddressValidator validator = null; if (custType.equals(Customer.US)) { validator = new USAddress(); } return validator; } }//end of class
Figure 20.2: Customer/USAddress Validator?Class Association
Figure 20.3: Class Adapter for the CAAddress Class Listing 20.6: CAAddressAdapter as a Class Adapter
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
在Customer類內部,getValidator私有方法需要擴展,以至于它可以在驗證加拿大客戶的時候返回一個CAAdressAdapter實例。返回的對象是多態的,USAddress和CAAddressAdapter都實現了AddressValidator接口,所以不用改變。 Listing 20.7: Customer Class Using the CAAddre