我有一个方法,我在我的实现中多次使用,只需非常简单的修改。我怎样才能避免重复自己呢?
...
while (!queue.isEmpty()) {
Element pivot = queue.poll();
elements.remove(pivot);
for (Element a : elements) {
if (areFriends(pivot, a)) {
db.addRelation(a, pivot);
queue.add(a);
elements.remove(a);
}
}
}
...我想用一个新的areFriends条件,f.e。areEnemies(元素枢轴,元素a),并继续使用整个代码和数据结构。我试图提取一个void方法,但在这种情况下,我必须传递所有变量(db、queue等)。作为输入,它看起来像是一个反模式。你知道怎么解决这个问题吗?谢谢!
发布于 2013-03-21 00:27:09
创建一个接口:
public interface Relation
{
public void execute(Element a, Element b);
}
public class AreFriendsRelation implements Relation
{
public void execute(Element a, Element b)
{
// Return the Relation result
}
}
public class AreEnemiesRelation implements Relation
{
public void execute(Element a, Element b)
{
// Return the Relation result
}
}将关系对象传递给您的方法:
public void MyMethod(Relation myRelation) {
...
while (!queue.isEmpty()) {
Element pivot = queue.poll();
elements.remove(pivot);
for (Element a : elements) {
if (myRelation.execute(pivot, a)) {
db.addRelation(a, pivot);
queue.add(a);
elements.remove(a);
}
}
}
...
}发布于 2013-03-21 00:25:56
您可以定义一个interface
public interface IElementFunction
{
public boolean execute(Element e1, Element e2);
}以及将interface的实现(命名的或匿名的classes)传递给公共函数:
private void commonFunction(IElementFunction ief)
{
while (!queue.isEmpty()) {
Element pivot = queue.poll();
elements.remove(pivot);
for (Element a : elements) {
if (ief.execute(pivot, a)) {
db.addRelation(a, pivot);
queue.add(a);
elements.remove(a);
}
}
}发布于 2013-03-21 00:25:13
您可以使用Command设计模式。使用方法public void checkElements(Element a, Element b)创建一个接口,并创建该接口的一些实例。在你的方法中,使用接口的方法,或者让你的方法接受一个接口实例作为参数,或者让它作为类成员。
https://stackoverflow.com/questions/15529068
复制相似问题