我的课程设计如下:
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]}
其中123
是ID
,字符串值C',
P ,
M`表示要根据相应的ID创建的设备。
我的问题是,如何通过调用相应的provision(deviceMap)
方法,在create
方法和create()
设备中迭代此地图。 (实现多态性)例如
P
- &gt;在create()
Printer
的{{1}}实施中致电Device
。我可以使用什么样的好设计/模式来构建类? enum
可以帮助解决这个问题,还是有更好的清洁方法?
答案 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
关于映射的enum
与String
:
enum
,因为它可以帮助我防止传递错误的值。Device
的所有类型(意味着您可以在enum
中找到它们的值;会发生在{其他人写了更多Device
s并在运行时加载这些文件)然后我选择了两个中的一个:
DeviceRequestBase
设置为:PrinterDeviceRequest
,MouseDeviceRequest
...如果请求设备类型,工厂将在类型之间进行映射。string
s