以特定方式处理通用实现列表

时间:2014-10-17 19:51:59

标签: java design-patterns

假设我有一个像这样的标记界面:

public interface Widget { };

以及该界面的各种实现:

public class AWidget implements Widget {
    ....
    public String getSomeAttribute() { return ...; }
}

public class AnotherWidget implements Widget {
    ....
    public String getAnotherAttribute() { return ...; }
}

进一步假设我有一些代码可以创建List并尝试处理它们:

List<? extends Widget> widgets = someMethodToCreateWidgets();

类似下面的内容可能在一个类中循环并处理小部件

for(Widget widget : widgets) {
    anotherClass.process(widget);
}

anotherClass有如下方法签名?

public class AnotherClass {
    public void process(AWidget widget) {
        ....
        widget.getSomeAttribute();
        ....
    }

    public void process(AnotherWidget widget) {
        ....
        widget.getAnotherAttribute();
        ....
    }
}

我觉得我之前在概念中看到了类似于此的实现,但我正在努力获得类似的工作。最终,我试图避免一个必须有一堆

process()方法
if ( widget instanceof AWidget ) {
    ... 
} 
else if ( widget instanceof AnotherWidget ) { 
    ... 
}

1 个答案:

答案 0 :(得分:1)

如果我理解正确,你正在寻找一种叫做“双重调度”的东西。访客模式是处理此问题的一种常用方式:http://en.wikipedia.org/wiki/Visitor_pattern