基于不同输入实现多种策略的设计模式

时间:2016-05-27 14:11:27

标签: java c# design-patterns

我可以将这种设计模式应用于这种情景吗?

我有实现BaseProcess类的进程类:  BaseProcess有一个CreateProcess(BaseObject o)方法,BaseObject有两个子项或多个。

 ProcessClassA : BaseProcess
 ProcessClassB : BaseProcess

 ObjectA : BaseObject 
 ObjectB : BaseObject 

我希望能够拥有一个可以具有多个ProcessClasses的类Process,就像在这种情况下的2个类一样,但是将来可能有更多类,例如3个或更多类和那个进程。我想使用这样的类:

Process.Process(BaseObject o)并发送特定对象,如果我发送ObjectA,则让Process类调用特定的类,如ProcessClassA。问题是我不想使用如果内部进程因为我在添加ProcessClassC时需要一个类

示例:

ObjectA exampleObj = new ObjectA  

Process p = new Process(List<BaseProcess>{ProcessClassA ,ProcessClassB }) //Something like this but dont need to be in the contructor or be a list could be //something else but that allows not to violate Open Close principle.

p.Process(exampleObj) => ProcessClassA.Process(exampleObj)  

1 个答案:

答案 0 :(得分:1)

如果您不想在Process Manager类中使用if子句,那么映射如何?

像这样;

HashMap<Class, BaseProcess> processMap = new HashMap<Class, BaseProcess>();

processMap.put(ObjectA.class, new ProcessClassA());
processMap.put(ObjectB.class, new ProcessClassB());
//... so on

Process p = new Process(processMap);
p.process(new ObjectA());

进程方法和构造函数应该类似于Process Manager类

中的那个
private HashMap<Class, BaseProcess> processMap;

public Process(HashMap<Class, BaseProcess> processMap)
{
   this.processMap = processMap;
}

public void process(BaseObject objectInstance)
{
   //"which returns ProcessClass?:BaseClass"
   processMap.get(objectInstance.getClass()).process(objectInstance);
}

我假设您的ProcessClassA或B(BaseProcess)是无状态的。如果没有,如果你想为每个ObjectA的实例创建ProcessClassA,那么你需要像这样更改你的hashmap HashMap<Class, Class>所以你可以将ObjectA.class绑定到ProcessA.class。并在Process Class构造函数中创建ProcessA类的实例。

此外,我确信将有更好的方法来命名这些类尝试使用抽象类和通用类型。