查找映射值并调用匹配的实现

时间:2016-07-01 10:06:11

标签: java oop design-patterns interface polymorphism

我的课程设计如下:

public interface Device {
    void create();
}

public class Printer implements Device {
    @Override
    public void create() {
}

public class Mouse implements Device {
    @Override
    public void create() {
}



public class ProcessImpl implements Processor {

   private final Map<String, Set<String>> deviceMap = new HashMap<>();

   @Override
   public void process(String input) {
       populateMap(input);

       //call to `provision(deviceMap)`

}

deviceMap值的排列方式如下: {123 = [P,M],224 = [C,P,M]}

其中123ID,字符串值C', P , M`表示要根据相应的ID创建的设备。

我的问题是,如何通过调用相应的provision(deviceMap)方法,在create方法和create()设备中迭代此地图。 (实现多态性)例如

P - &gt;在create() Printer的{​​{1}}实施中致电Device。我可以使用什么样的好设计/模式来构建类? enum可以帮助解决这个问题,还是有更好的清洁方法?

1 个答案:

答案 0 :(得分:1)

为可能不正确的Java语法和约定道歉(我是C#开发人员)但是:

您可以让工厂在允许的字符串与Device类型之间进行映射:

public interface IDeviceFactory {
    Device getDevice(string string input);
}

public class MappingDeviceFactory implements IDeviceFactory {

    private Map<String, Device> _mapping;

    public MappingDeviceFactory(Map<String, Device> mapping) {
        _mapping = mapping;
    }

    public Device getDevice(string string input) {
        //Look in the mapping for the input and return that device.
    }
}

另一种方式是每个设备都会说&#34;&#34;它是什么类型的输入:

public interface Device {
    String _type;
    void create();
}

public abstract class DeviceBase {
    public String _type;

    public DeviceBase(String type) {
        _type = type;
    }

    public abstract void create();
}

public class Printer implements DeviceBase {
    public Printer() super ("P") {}
    @Override
    public void create() {}
}

然后在上面IDeviceFactory的实现中,只有Device的集合而不是映射,并根据给定的input

搜索集合

关于映射的enumString

  • 我更喜欢在字符串上使用enum,因为它可以帮助我防止传递错误的值。
  • 但是,如果您在编译时不知道Device的所有类型(意味着您可以在enum中找到它们的值;会发生在{其他人写了更多Device s并在运行时加载这些文件)然后我选择了两个中的一个:
    • 将对象DeviceRequestBase设置为:PrinterDeviceRequestMouseDeviceRequest ...如果请求设备类型,工厂将在类型之间进行映射。
    • 如果这感觉像是一种矫枉过正而且你不需要它如此可扩展 - 那么只要坚持string s