return validator.isValidAddress(address, zip, state);
}
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
CAAddressAdapter设计和对AddressValidator(声明期望的接口)对象的多态调用使Customer可以利用接口不兼容CAAddress类提供的服务。
1f3c0ibb0e65
Figure 20.4: Address Validation Application?Using Class Adapter
c2t12b1g8856
Figure 20.5: Address Validation Message Flow?Using Class Adapter
作为对象适配器的地址适配器
当讨论以类适配器来实现地址适配器时,我们说客户类期望的AddressValidator接口是Java接口形式。现在,让我们假设客户类期望AddressValidator接口是抽象类而不是java接口。因为适配器CAAdapter必须提供抽象类AddressValidatro中声明的接口,适配器必须是AddressValidator抽象类的子类、实现抽象方法。
Listing 20.8: AddressValidator as an Abstract Class
public abstract class AddressValidator {
public abstract boolean isValidAddress(String inp_address,
String inp_zip, String inp_state);
}//end of class
Listing 20.9: CAAddressAdapter Class
class CAAddressAdapter extends AddressValidator {
…
…
public CAAddressAdapter(CAAddress address) {
objCAAddress = address;
}
public boolean isValidAddress(String inp_address,
String inp_zip, String inp_state) {
…
…
}
}//end of class
因为多继承在JAVA中不支持,现在适配器CAAddressAdapter不能继承现有的CAAddress类,它已经使用了唯一一次继承其他类的机会。
应用对象适配器模式,CAAddressAdapter可以包含一个适配者CAAddress的一个实例。当适配器第一次创建的时候,这个适配者的实例通过客户端传递给适配器。通常,适配者实例可以通过下面两种方式提供给包装它的适配器。
(1) 对象适配器的客户端可以传递一个适配者的实例给适配器。这种方式在选择类的形式上有很大的灵活性,但是客户端感知了适配者或者适配过程。这种方法在适配器不但需要适配者对象行为而且需要特定状态时很适合。
(2) 适配器可以自己创建适配者实例。这种方法相对来说缺乏灵活性。适用于适配器只需要适配者对象的行为而不需要适配者对象的特定状态的情况。
2wu05ssw243c
Figure 20.6: Object Adapter for the CAAddress Class
Listing 20.10: CAAddressAdapter as an Object Adapter
本文章更多内容:<<上一页 - 1 - 2 - 3 - 4 - 5 - 下一页>> |