CRP(Common Reuse Principle,共用原则)是面向对象编程中的一个重要原则,它要求软件实体(类、模块、函数等)应该共用,而不是重复。下面是一个简单的例子,说明CRP的应用。
假设我们有一个图形类Shape
,它有一个求面积的方法getArea()
,并且有两个子类Rectangle
和Circle
,它们分别表示矩形和圆形,它们都继承自Shape
类,如下所示:
public abstract class Shape {
public abstract double getArea();
}
public class Rectangle extends Shape {
private double width;
private double height;
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
@Override
public double getArea() {
return width * height;
}
}
public class Circle extends Shape {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public double getArea() {
return Math.PI * radius * radius;
}
}
现在我们要设计一个计算所有图形面积之和的方法getTotalArea()
假设我们有一个图形类Shape
,它有一个求面积的方法getArea()
,并且有两个子类Rectangle
和Circle
,它们分别表示矩形和圆形,它们都继承自Shape
类,如下所示:
public abstract class Shape {
public abstract double getArea();
}
public class Rectangle extends Shape {
private double width;
private double height;
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
@Override
public double getArea() {
return width * height;
}
}
public class Circle extends Shape {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public double getArea() {
return Math.PI * radius * radius;
}
}
现在我们要设计一个计算所有图形面积之和的方法getTotalArea()
,并且我们知道这个方法可能会被其他模块或类重复使用,因此我们需要遵循CRP原则,尽量将方法设计成可复用的,避免重复实现类似的功能。
为了实现这个目标,我们可以将getTotalArea()
方法设计成一个静态工具方法,放在一个独立的工具类ShapeUtils
中,这样其他模块或类就可以直接使用它,而不需要重复实现类似的功能。具体实现如下:
public class ShapeUtils {
public static double getTotalArea(Shape[] shapes) {
double totalArea = 0.0;
for (Shape shape : shapes) {
totalArea += shape.getArea();
}
return totalArea;
}
}
在这个例子中,我们将计算所有图形面积之和的方法getTotalArea()
放在了一个独立的工具类ShapeUtils
中,并且将它设计成一个静态方法,接受一个Shape
类型的数组作为参数,返回所有图形的总面积。这样其他模块或类就可以直接使用它,而不需要重复实现类似的功能。
例如,我们可以在其他类中直接调用ShapeUtils.getTotalArea()
方法来计算图形面积,例如:
Rectangle r1 = new Rectangle(3.0, 4.0);
Rectangle r2 = new Rectangle(5.0, 6.0);
Circle c1 = new Circle(2.0);
Shape[] shapes = {r1, r2, c1};
double totalArea = ShapeUtils.getTotalArea(shapes);
System.out.println("Total area: " + totalArea);
在这个例子中,我们创建了两个矩形和一个圆形,并将它们放入一个Shape
类型的数组中,然后调用ShapeUtils.getTotalArea()
方法来计算所有图形的总面积。通过这种方式,我们遵循了CRP原则,将计算所有图形面积之和的方法设计成一个可复用的工具方法,避免了重复实现类似的功能,提高了代码的可复用性和可维护性。