2

我正在尝试创建一个 API,以便在其他程序员使用我的服务时不需要实现和类名。该服务对“项目”执行各种操作,但服务应如何处理对项目的请求的主要影响因素是基于用户类型。到目前为止,我有一个接口(Item)和一个实现服务(ItemService),然后是几个从这个扩展的用户类型类(例如CompanyItemService)。用户类型也具有超类User和子类的结构,例如Company

public class ItemService<T extends User> extends Item {
    User user;
    public ItemService(User user) {
        this.user = user;
    }

    @Override
    public boolean belongsToUser() {
        //Check all records
    }
}

public class CompanyItemService<T extends Company> extends ItemService<Company> {
    public CompanyItemService(Company user) {
        super(user);
    }

    @Override
    public boolean belongsToUser() {
        //Check company specific records
    }
}

public class User {
    //Common user stuff
}

public class Company extends User {
    //Company specific stuff
}

所以我希望能够通过如下调用使用我的服务:

User company = new Company();
//stuff
Item item = new ItemService<Company>(company)
item.belongsToUser();

但是,当我这样做时,ItemService将调用CompanyItemService. 是否有可能在不需要知道它属于类的情况下获得这个覆盖方法CompanyItemService

干杯,

阿列克谢蓝。

所有这一切的一般想法是,当发明另一种用户类型时,如果需要,可以添加另一种用户特定的服务,而现有代码不受影响。而且,如果有很多用户类型,我只希望使用 API 的人必须记住使用ItemService泛型来完成其余的工作。

4

2 回答 2

4

You need to use the abstract factory pattern. In short, you need a static method someplace which knows about all the possible ItemService subclasses and, given an Item object or a Class which is a subclass of User, returns an instance of the correct ItemService subclass. In other words, something like

public static ItemService<?> instance(Class<? extends User> c) {
    if (c == Customer.class)
        return new CustomerItemService();
    else if (c == Employee.class)
        return new EmployeeItemService();
    ...
}

Then you can say

ItemService<?> service = ItemService.instance(Customer.class);

Alternatively, you could build a map:

Map<Class<? extends User>, Class<? extends ItemService>> services = 
    new HashMap<Class<? extends User>, Class<? extends ItemService>>() {{
    put(Customer.class, CustomerItemService.class);
    put(Employee.class, EmployeeItemService.class);
    // more...
}};

Then instance() could just look like

ItemService<? extends User> instance(Class<? extends User> c) {
    return services.get(c);
}
于 2012-05-22T13:48:59.640 回答
0

代码可以正常工作。创建一个 ItemService 实例:

Item item = new ItemService<Company>(company);

如果您调用 ItemService 的 belongsToUser() 方法,将被调用。您应该创建 CompanyItemService 的实例来调用它的方法。

于 2012-05-22T13:56:56.380 回答