java - 编写异构集合时可以避免适配器类吗?

标签 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);
    }
}

最佳答案

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

    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();
    }
}

关于java - 编写异构集合时可以避免适配器类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7051210/

相关文章:

PHP 最佳设计实践

java - JSF中模型和 Controller 的区别

java - 替换 html 标签

java - 如何选择可以放置元素的方 block ?

java - 复杂构建器模式场景 - java

java - 隐藏类的实例变量

C++ 类设计——如何在基类析构函数中清理

java - 我的复制构造函数出了什么问题?

design-patterns - 适配器模式与 Liskov 替换

php - Singleton 和 Registry 设计模式有什么区别