如何在运行时识别对象的类型?

bra*_*ter 0 java oop design-patterns

类别:

public abstract class BaseHolidayPackageVariant {
    private Integer variantId;
    private HolidayPackage holidayPackage;
    private String holidayPackageType;
}

public class LandHolidayPackageVariant extends BaseHolidayPackageVariant{

}

public class FlightHolidayPackageVariant extends BaseHolidayPackageVariant{
    private Destination originCity;
}

public class HolidayPackage{
    ArrayList<BaseHolidayPackageVariant> variants;

    BaseHolidayPackageVariant defaultVariant;
}
Run Code Online (Sandbox Code Playgroud)

在运行时,如何知道variants []中的给定对象是否为Type,LandPackageVariant或者FlightPackageVariant不执行以下某种操作:

if(holidayPackageType.equals("LandHolidayPackageVariant")
 obj = (LandHolidayPackageVariant)variant[i];
else if(holidayPackageType.equals("FlightHolidayPackageVariant")
 obj = (FlightHolidayPackageVariant)variant[i];
Run Code Online (Sandbox Code Playgroud)

这个问题源于我在这里提出的设计问题

Tom*_*son 5

在良好的面向对象设计中,您不应该知道对象是否属于特定类型.你只需要在它上面调用方法,对象就是正确的.

例如,FlightHolidayPackageVariant有一个originCity不在其他HolidayPackageVariant类中的字段,并且您希望在UI中呈现该字段.解决这个问题的面向对象的方法是以HolidayPackageVariant某种方式使负责控制自己的渲染.假设您的UI将显示每个变体的属性列表.您可以让变体提供这些列表:

public abstract class BaseHolidayPackageVariant {
    private int cost;

    public Map<String, String> getDetails() {
        HashMap<String, String> details = new HashMap<String, String>();
        details.put("cost", String.format("%.2f", cost / 100.0));
        return details;
    }
}

public class FlightHolidayPackageVariant extends BaseHolidayPackageVariant {
    private Destination originCity;

    @Override
    public Map<String, String> getDetails() {
        Map<String, String> details = super.getDetails();
        details.put("origin city", originCity.getName());
        return details;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,您的UI代码可以简单地询问每个变体对象的详细信息,而无需知道它是什么类型的变体.