接口隔离原理

时间:2017-01-07 03:45:18

标签: java design-patterns

我正在学习使用Java的SOLID原则,我正在尝试使用它来实现两个类。我的问题是关于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);
}

如何在不实现不必要的方法的情况下引用具有相同接口的两个类?

2 个答案:

答案 0 :(得分:2)

将您的Number接口(或基类)分成多个接口。标准操作(加,减等)合二为一;让我们说INumberpolarFormrectangularForm是另一个人的一部分;让我们说IComplex

Real将实施INumber; Complex会实施INumberIcomplex。然后,您可以将它们都视为INumber

如有必要,您还可以创建另一个实现这两者的界面。

答案 1 :(得分:2)

解决此问题的另一种解决方案是将 Composition 而不是 Inhertiance 与接口隔离原则结合使用。

数字等级

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
}

PolarForm界面

public interface PolarForm {
    public String transform(BigDecimal number);
}

RectangularForm接口

public interface RectangleForm {
    public String transform(BigDecimal number);
}

实数的RectangleForm实现

public class RectangleFormReal implements RectangleForm {

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

    }

}

实数的PolarForm实现

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

您可以创建PolarFormComplexRectangleFormComplex实现,并以类似的方式连接Number实例。这种方法的优点是你的代码总是依赖于Number类的接口(通过接口我的意思是公共API),你可以通过注入相应的PolarForm或{来选择转换策略。 {1}}实例在编译时编译到RectangleForm实例,如上所示或在运行时(通过工厂)