2012-05-18 57 views
1

有什么解决的正确方法:什么是正确的模式?

Class A { 

methodDoSomeOperation() { 

    ClassB b.someOperation(.....); 
.... 

} 


ClassB { 

someOperation(....) { 


if (this.someCondition) then{ 
    ClassC c.anotherOperation(....) 
    } else { 
ClassD d.... 
} 
} 

} 

方法c.anotherOperation需要很长的时间。我希望收到有关所选内容的通知:c.anotherOperation(....)d.....用于在调用c.anotherOperation之前显示在用户界面中。

是这样的:

someOperation(....) { 


if (this.someCondition) then{ 
//notify ClassA what was selected and continue 
ClassC c.anotherOperation(....) 
} else { 
ClassD d.... 
} 
} 

显然,可以以调用在ClassA一些方法,但这种产生强耦合,混乱的逻辑。是否可以使用Spring的某些功能?

+0

[春季批量](http://static.springsource.org/spring-batch/)提供条件开关取决于方法的结果,用于完全使用XML,而不需要相互了解的类。看看它是否适合您的项目 –

回答

1

你会考虑某种形式的观察者模式吗? 无论接近UI的类(可能是A类?)都可以注册为类B的观察者。这可以通过添加一个参数预先完成或作为调用B.SomeOperation()的一部分完成。然后,当您检查B.someCondition时,您可以调用注册的观察者,然后调用C上的长时间运行操作。

2

难道说你想找一个Decorator Pattern?这将适用于每个班级添加/汇总他们的部分。

甚至一个Chain of Responsibility?这可能更适用,因为每个类都可以选择进行处理。假设类A,B和C是Processing对象,它们将具有逻辑来定义它们将在哪些操作上进行操作,从而可选地执行它们的特定处理,然后传递到下一个处理对象。考虑到你似乎将A,B和C链接在一起,每个人都表现出他们的角色,这似乎最适合你的描述。然后为了指示哪些Processing对象完成了它们的部分,可以定义一个Context并沿链传递它,并且每个Object将填充它们的部分。

+0

装饰者或责任链似乎与此问题无关。 – user810430

+0

它看起来类似于听众模式... – user810430

+0

不太确定听众模式。我会添加更多的细节来更好地解释自己。 – Brady

1

您是否想让用户在开始之前取消c.anotherOperation()?如果是这样,那么someOperation()并不实际调用它。相反,它会导致显示一个ok/cancel对话框,并且该ok选项被用户界面视为一个导向c.anotherOperation()的命令。 (也许通过ClassA和ClassB的方式再次,这取决于他们的责任是什么。)

相关问题