在编写异构集合时,我可以避免使用适配器类吗?

时间:2011-08-13 14:59:34

标签: java oop design-patterns collections adapter

我需要一个“处理器”类的集合(我碰巧使用的是Java),它可以在一个具体的形状上运行,比如一个圆圈。有些类可以在抽象形状上运行,而其他类则需要具体的圆类。

问题在于,我不知道我可以使用任何语言或设计机制来避免像CircleSaver这样的适配器类。如果我无法避免这种情况,我将为每个需要具体形状的处理器类创建一个适配器方法。

此问题/模式是否有名称?有解决方案吗?

List<CircleProcessor> circleProcessors = new ArrayList<CircleProcessor>
 (Arrays.asList(new CircleDrawer(), new CircleSaver()));

interface ShapeProcessor {
    void execute(Shape circle);
}

interface CircleProcessor {
    void execute(Circle circle);
}

class CircleDrawer implements CircleProcessor {
    public void execute(Circle circle) {
        // Draw circle
    }
}

class ShapeSaver implements ShapeProcessor {
    public void execute(Shape shape) {
        shape.save();
    }
}

// Adapter method that I would love to avoid
class CircleSaver implements CircleProcessor {
    public void execute(Circle circle) {
        new ShapeSaver().execute(circle);
    }
}

2 个答案:

答案 0 :(得分:2)

在提出问题之后,我想我已经提出了一个使用泛型的更好的版本。如果有更好的解决方案和/或此问题的名称,请告诉我!

    List<ShapeProcessor<Circle>> circleProcessors = new ArrayList<ShapeProcessor<Circle>>(
 Arrays.asList(new CircleDrawer(), new ShapeSaver<Circle>()));

public interface ShapeProcessor<T extends Shape> {
    void execute(T t);
}

public class CircleDrawer implements ShapeProcessor<Circle> {
    @Override
    public void execute(Circle circle) {
        // Draw circle
    }
}

public class ShapeSaver<T extends Shape> implements ShapeProcessor<T> {
    @Override
    public void execute(T t) {
        t.save();
    }
}

答案 1 :(得分:-1)

它看起来很像Strategy模式。我将CircleProcessor作为一个带有template method的抽象类:

abstract class CircleProcessor implements ShapeProcessor {
  public final void execute(Shape shape) {
    if (!(shape instanceof Circle)) return; // ignore everything but circles

    execute((Circle) shape);
  }

  protected abstract execute(Circle circle);
}

假设Circle在此处展开​​Shape,但它允许您将各种处理器添加到您的收藏中,并且所有支持您的对象的处理器都可以完成其工作。