Можно ли избежать классов адаптеров при составлении разнородных коллекций? - PullRequest
2 голосов
/ 13 августа 2011

Мне нужна отдельная коллекция «процессорных» классов (я использую 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 ]

2 голосов
/ 13 августа 2011

Задав вопрос, я думаю, что придумал гораздо лучшую версию, которая использует дженерики.Если есть лучшее решение и / или название для этой проблемы, пожалуйста, дайте мне знать!

    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();
    }
}
0 голосов
/ 13 августа 2011

Это очень похоже на шаблон Strategy .Я бы сделал CircleProcessor абстрактный класс с шаблонным методом :

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 здесь, но он позволяет добавлять все виды процессоровВаша коллекция и все, что поддерживают ваш объект, выполнят свою работу.

...