java - Java Composite 的层次结构问题

标签 java overloading composite class-hierarchy

我正在尝试在 Java 上使用复合模式来制作报告,但我显然忘记了层次结构和方法重载是如何工作的。

假设我有以下模型:

public class Product {

    public String get(){
        return "Product";
    }

}

public class BProduct extends Product {

    public String getB() {
        return "BBBBB";
    }

}

public class CProduct extends Product {

    public String getC() {
        return "CCCCC";
    }

}

以及以下转换器:

import java.util.List;

public class Converter {

    private List<Converter> converters;

    public Converter() {

    }

    public Converter(List<Converter> converters) {
        this.converters = converters;
    }

    public void execute(Product product) {
        for (Converter converter : converters) {
            converter.execute(product);
        }
    }

}

public class BConverter extends Converter {

    @Override
    public void execute(Product product) {
        innerExecute(product);
    }

    public void innerExecute(Product product) {
        System.out.println(product.get() + " done on B normal.");
    }

    public void innerExecute(BProduct b) {
        System.out.println(b.getB() + " done on B special.");
    }

}

public class CConverter extends Converter {

    @Override
    public void execute(Product product) {
        System.out.println(product.get() + " done on C normal.");
    }

    public void execute(CProduct c) {
        System.out.println(c.getC() + " done on C special.");
    }

}

使用以下测试对其进行测试:

import java.util.ArrayList;
import java.util.List;

import org.junit.Test;

public class ProductConverterTest {

    @Test
    public void test() {
        List<Converter> converters = new ArrayList<>();
        converters.add(new BConverter());
        converters.add(new CConverter());
        Converter converter = new Converter(converters);

        List<Product> list = new ArrayList<>();
        list.add(new Product());
        list.add(new BProduct());
        list.add(new CProduct());

        for (Product product : list) {
            converter.execute(product);
        }
    }
}

获取输出:

Product done on B normal.
Product done on C normal.
Product done on B normal.
Product done on C normal.
Product done on B normal.
Product done on C normal.

当我想要的是:

Product done on B normal.
Product done on C normal.
BBBBB done on B special.
Product done on C normal.
Product done on B normal.
CCCCC done on C special.

注意:我想在不使用instanceof的情况下执行此操作。我已经知道如何用它来做。我想知道的是如果没有它是否可以完成。

最佳答案

出现此行为的原因是 #execute 方法重载。在编译时选择要调用的重载方法。为了使其按您希望的方式工作,您必须使用动态选择,这将导致 instanceOf 检查或覆盖 product 的方法或传递/检索类并进行比较:

public class Converter {

    private List<Converter> converters;

    public Converter() {

    }

    public Converter(List<Converter> converters) {
        this.converters = converters;
    }

    public void execute(Product product) {
        for (Converter converter : converters) {
            converter.execute(product);
        }
    }

}

public class BConverter extends Converter {

    @Override
    public void execute(Product product) {
        if (product.getClass() == BProduct.class) {
            innerExecute((BProduct)product);
        } else {
            innerExecute(product);
        }
    }

    public void innerExecute(Product product) {
        System.out.println(product.get() + " done on B normal.");
    }

    public void innerExecute(BProduct b) {
        System.out.println(b.getB() + " done on B special.");
    }

}

public class CConverter extends Converter {

    @Override
    public void execute(Product product) {
        if (product.getClass() == CProduct.class) {
            innerExecute((CProduct)product);
        } else {
            innerExecute(product);
        }
    }

    public void innerExecute(Product product) {
        System.out.println(product.get() + " done on C normal.");
    }

    public void innerExecute(CProduct b) {
        System.out.println(b.getC() + " done on C special.");
    }

}

关于java - Java Composite 的层次结构问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35265933/

相关文章:

c# - 方法重载和多态性

sql - 综合指数如何运作?

C++ - 如何用自己的类复制 std::fixed 语法

c++ - 为什么采用 int 的函数重载优于采用 unsigned char 的函数重载?

Java - 编码风格 : What are the cons and pros of "ABC". 等于 ("SOMESTRING") 风格字符串比较?

java - Android模拟器从本地FTP服务器下载报错 "227 Entering Passive Mode"/"Connection refused"

Javascript off-DOM 对象事件和事件冒泡

java - GWT:将复合小部件添加到 RootPanel 时执行停止

java - sonar-project.properties 中的 Glob

java - 有没有办法在 GraalVM 原生镜像中使用 kotlin.random.Random