我可以使用哪种OOP设计模式来允许不同类型的地址类?

Eri*_*air 0 architecture oop design-patterns

我有一个基Address类,它定义了基本的地址属性,并充当CRUD对象:

  • 名称
  • 公司
  • 地址第一行
  • 地址第2行
  • 地址第3行
  • 邮政编码
  • 国家

我有一个'ShipToAddress'类,它扩展了Address并包含了两个属性:

  • 电话号码
  • 电子邮件地址

Address包括每个属性的验证方法,并ShipToAddress包括仅对其属性(电话号码和电子邮件地址)进行验证.

我的问题是,我还想在不重复代码的情况下考虑这两个类的美国和国际地址,以便我可以为州和邮政编码提供不同的验证方法.美国国家验证将确保该值是50个国家之一.国际验证只会确保它不超过数据库中允许的长度.

我如何设计它以允许任意数量的不同类型的地址(美国,加拿大等),但也有基Address类和ShipToAddress类,而不重复代码?我基本上想要以下内容:

  • Address 基类
  • ShipToAddress
  • USAAddress
  • USAShipToAddress
  • ***Address
  • ***ShipToAddress

Sam*_*eer 5

将AddressValidator定义为单独的接口.

public interface AddressValidator {
    boolean validateAddress(ShipToAddress add);
}
Run Code Online (Sandbox Code Playgroud)

创建它的不同实现- USAAddressValidator,CanadaAddressValidator等等.

您可以根据国家/地区Factory为您提供适当的AddressValidator对象.

public class AddressValidatorFactory {
    public static AddressValidator GetValidator(Address address) { ... }   
}
Run Code Online (Sandbox Code Playgroud)

你也应该考虑是否ShipToAddress应该extend Address还是contain它.你打算把ShipToAddress对象传递到Address预期的位置吗?如果没有,那么就没有必要ShipToAddress扩展地址.