组合/聚合复用原则的Java案例吧
时间: 2023-11-24 22:05:34 浏览: 91
java组合模式例子
组合/聚合复用原则是指在设计类之间的关系时,应该优先考虑使用组合或聚合关系,而不是继承关系,以达到代码复用的目的。下面是一个使用组合/聚合复用原则的Java案例:
假设有一个图形类Shape,其中包含了计算面积的方法calculateArea(),以及一个颜色属性color。现在需要创建一个矩形类Rectangle,它继承自Shape并添加了一个宽度属性width和一个高度属性height,同时重写了calculateArea()方法来计算矩形面积。这样的设计虽然简单,但存在以下问题:
1. Rectangle类和Shape类之间存在继承关系,这会使得Rectangle类紧耦合于Shape类,难以扩展和修改。
2. 如果后续需要创建其他形状的类,比如圆形类Circle,就需要再次重复实现计算面积的方法,造成了代码的冗余。
为了解决这些问题,我们可以使用组合/聚合复用原则来重新设计:
首先,我们不再让Rectangle类继承自Shape类,而是将Shape类作为Rectangle类的一个属性,即将Shape类对象组合到Rectangle类中。这样Rectangle类就能够调用Shape类的calculateArea()方法来计算面积,而不需要重复实现。
其次,我们可以将Shape类设计为一个抽象类,其中包含了一个抽象方法calculateArea(),以及一个颜色属性color。然后,我们可以创建具体的形状类,比如Rectangle和Circle类,它们都继承自Shape类,并根据自己的特点实现calculateArea()方法。这样,我们就避免了代码的冗余,并且能够方便地扩展和修改形状类。
下面是具体的Java代码实现:
```
abstract class Shape {
protected String color;
public abstract double calculateArea();
// getters and setters for color
}
class Rectangle {
private double width;
private double height;
private Shape shape;
public Rectangle(double width, double height, Shape shape) {
this.width = width;
this.height = height;
this.shape = shape;
}
public double calculateArea() {
return width * height;
}
// getters and setters for width and height
// delegate getters and setters for color to shape object
public String getColor() {
return shape.getColor();
}
public void setColor(String color) {
shape.setColor(color);
}
}
class Circle {
private double radius;
private Shape shape;
public Circle(double radius, Shape shape) {
this.radius = radius;
this.shape = shape;
}
public double calculateArea() {
return Math.PI * radius * radius;
}
// getters and setters for radius
// delegate getters and setters for color to shape object
public String getColor() {
return shape.getColor();
}
public void setColor(String color) {
shape.setColor(color);
}
}
```
在以上代码中,Rectangle类和Circle类都使用了组合的方式来复用Shape类。同时,Shape类被设计为一个抽象类,以便于创建具体的形状类并重写calculateArea()方法。这样,我们就成功地使用了组合/聚合复用原则来优化设计,并提高了代码的可扩展性和可维护性。
阅读全文