我需要一个“处理器”类的集合(我碰巧使用的是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);
}
}
答案 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
,但它允许您将各种处理器添加到您的收藏中,并且所有支持您的对象的处理器都可以完成其工作。