if (custType.equals(Customer.US)) {
validator = new USAddress();
}
return validator; 逆风编程技术
}
}//end of class
70op8i5elq39
Figure 20.2: Customer/USAddress Validator?Class Association
但是当验证来自加拿大的客户时,就要对应用进行改进。这需要一个验证加拿大客户地址的验证类。让我们假设已经存在一个用来验证加拿大客户地址的使用工具类CAAddress。
从下面的CAAdress类的实现,可以发现CAAdress提供了客户类Customer类所需要的验证服务。但是它所提供的接口不用于客户类Customer所期望的。
Listing 20.5: CAAdress Class with Incompatible Interface
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
CAAdress类提供了一个isValidCanadianAddr方法,但是Customer期望一个声明在AddressValidator接口中的isValidAddress方法。
接口的不兼容使得Customer对象利用现有的CAAdress类是困难的。一种意见是改变CAAdress类的接口,但是可能会有其他的应用正在使用CAAdress类的这种形式。改变CAAdress类接口会影响现在使用CAAdress类的客户。
应用适配器模式,类适配器CAAdressAdapter可以继承CAAdress类实现AddressValidator接口。
udtr40j091ei
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
因为适配器CAAdressAdapter实现了AddressValidator接口,客户端对象访问适配器CAAdressAdapter对象是没有任何问题的。当客户对象调用适配器实例的isValidAddress方法的时候,适配器在内部把调用传递给它继承的isValidCanadianAddr方法。
在Customer类内部,getValidator私有方法需要扩展,以至于它可以在验证加拿大客户的时候返回一个CAAdressAdapter实例。返回的对象是多态的,USAddress和CAAddressAdapter都实现了AddressValidator接口,所以不用改变。
Listing 20.7: Customer Class Using the CAAddressAdapter Class
class Customer {
…
…
public boolean isValidAddress() {
//get an appropriate address validator
AddressValidator validator = getValidator(type);
//Polymorphic call to validate the address
本文章更多内容:<<上一页 - 1 - 2 - 3 - 4 - 5 - 下一页>> |