Java中如何改造方法适配实现同一接口的多个不同对象
解决方案
- 第一步:定义统一的Rentable接口,约定所有可租赁对象的行为规范
public interface Rentable { // 统一返回租赁物的类型信息 String getType(); }
原有Vehicle类直接实现该接口即可,不需要修改内部已有逻辑(你已经写好了getType()方法);后续新增Building类时,实现该接口并实现getType()返回建筑类型即可。
- 第二步:调整Order类的成员存储结构,解除和具体租赁物类型的耦合
建议用集合存储所有租赁物实例,兼容单个订单同时包含车辆、建筑等多类租赁物的场景,也兼容旧逻辑:
public class Order { // 用接口类型存储所有租赁物,替换原有的Vehicle类型成员 private List<Rentable> rentItems = new ArrayList<>(); private Customer customer; private Date date; // 保留原有设置车辆的方法,兼容历史代码 public void setVehicle(Vehicle vehicle) { rentItems.add(vehicle); } // 后续新增Building属性时,只需要加这个方法,不需要修改打印逻辑 public void setBuilding(Building building) { rentItems.add(building); } // 其他原有成员方法保持不变 }
如果你的业务规定单个订单只能对应一类租赁物,也可以直接把原有Vehicle vehicle成员改成Rentable rentItem,设置车辆和建筑时都给这个成员赋值即可,不需要用集合。
- 第三步:修改showOrder方法,基于接口实现通用打印逻辑
public void showOrder() { System.out.println("-------------------------------------------------------|Order Placed|-------------------------------------------------------"); for (Rentable item : rentItems) { // 自动适配所有实现Rentable接口的类,不需要针对Vehicle、Building做分支判断 System.out.println("The order for the " + item.getClass().getSimpleName() + " type " + item.getType() + " it was placed on the name " + customer.getName() + " in date of " + date); } System.out.println("----------------------------------------------------------------------------------------------------------------------------"); }
修改后完全符合开闭原则,后续新增任意可租赁品类,只要实现Rentable接口,在Order中新增对应的设置方法即可,不需要调整showOrder的打印逻辑,实现了代码的解耦和通用化。
内容的提问来源于stack exchange,提问作者Alin Balan
相关产品推荐
相关产品推荐

