Java 界面分离原理

Java 界面分离原理,java,design-patterns,Java,Design Patterns,我正在用Java学习坚实的原则,并试图用它实现两个类。我的问题是关于ISP。我有一些方法存在于一个类中,但不存在于另一个类中,我还必须使用相同的接口引用这两个类。 这是第一节课: public final class Complex implements Number { @Override public String polarForm() { //This class needs to implement this method } @Ove

我正在用Java学习坚实的原则,并试图用它实现两个类。我的问题是关于ISP。我有一些方法存在于一个类中,但不存在于另一个类中,我还必须使用相同的接口引用这两个类。 这是第一节课:

public final class Complex implements Number {
    @Override
    public String polarForm() {
        //This class needs to implement this method
    }

    @Override
    public String rectangularForm() {
        //This class needs to implement this method
    }
}
这是第二个:

public final class Real implements Number {
    @Override
    public String polarForm() {
        //This class does not need this method!
    }

    @Override
    public String rectangularForm() {
        //This class does not need this method!
    }
}
最后,我必须提到类似这样的类:

public static void main(String[] args) {
    Number c = new Complex();
    Number r = new Real();
    Number n = c.add(r);
    System.out.println(c.polarForm());
    System.out.println(n);
}
如何使用同一接口引用两个类而不实现不必要的方法?

将数字接口或基类分解为多个接口。标准的加法、减法等运算是一体的;让我们说一个月吧。极形和矩形是另一种的一部分;比方说我很复杂

Real将实施INumber;Complex将实现INumber和Icomplex。然后,您可以将两者都视为INumber


如有必要,您还可以创建另一个同时实现这两个功能的接口。

解决此问题的另一种解决方案是结合接口隔离原则使用组合而不是固有

数字类

极形界面

矩形界面

实数的矩形实现

实数的极形实现

拼凑


您可以创建PolarFormComplex和RectangleFormComplex实现,并以类似的方式连接Number实例。这种方法的优点是,您的代码将始终依赖于Number类的接口,我指的是公共API,您可以选择转换策略,方法是在编译时将相应的PolarForm或矩形实例注入Number实例,如上图所示,或在运行时通过工厂注入Number实例你的问题?我如何引用具有相同接口的两个类而不实现不必要的方法?我认为问题是我如何实现接口隔离原则,在这种情况下,我们需要创建两个更具体的接口,Real and Complex可以实现。如果你想让polarForm成为数字上的方法,当你不知道它是复数还是实数时,如果调用实数,你希望polarForm做什么?如果您的答案是不允许的,那么方法polarForm不属于数字。此OP说明如何使用相同的接口引用两个类,而不实现不必要的方法?。您的方法的一个直接问题是API的用户不能依赖单个接口,即数字。如果API的用户想要调用polarForm方法,他们总是需要一个IComplex类型的引用,或者求助于将数字引用转换为IComplex,从而依赖于多个接口。
public class Number {
    private RectangleForm rectangleForm;
    private PolarForm polarForm;
    private BigDecimal value;

    public Number(RectangleForm rectangleForm, PolarForm polarForm,BigDecimal value) {
        this.rectangleForm = rectangleForm;
        this.polarForm = polarForm;
        this.value = value;
    }

    public String polarForm() {
        return polarForm.transform(this.value);
    }

    public String rectangleForm() {
        return rectangleForm.transform(this.value);
    }

    //other methods such as add and subtract
}
public interface PolarForm {
    public String transform(BigDecimal number);
}
public interface RectangleForm {
    public String transform(BigDecimal number);
}
public class RectangleFormReal implements RectangleForm {

    @Override
    public String transform(BigDecimal number) {
        String transformed = "";
        //transfromed = logic to transform to rectangle form
        return transformed;

    }

}
public class PolarFormReal implements PolarForm {

    @Override
    public String transform(BigDecimal number) {
        //return the number as is without any transformation
        return number.toString();   
    }

}
public class NumberTest {
    public static void main(String[] args) {
        RectangleForm rf = new RectangleFormReal();
        PolarForm pf = new PolarFormReal();
        Number number = new Number(rf, pf,new BigDecimal(10));
        String rectangleForm = number.rectangleForm();
        String polarForm = number.polarForm();
    }
}