You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
work/CompositeShape.java

143 lines
3.3 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package challenge;
import basic.Shape;
import advanced.Resizable;
import java.util.ArrayList;
import java.util.List;
/**
* 复合图形类实现Shape接口和Resizable接口用于组合多个图形
*/
public class CompositeShape implements Shape, Resizable {
private String color;
private String name;
private List<Shape> shapes;
/**
* 构造方法
* @param name 复合图形的名称
* @param color 复合图形的颜色
*/
public CompositeShape(String name, String color) {
this.name = name;
this.color = color;
this.shapes = new ArrayList<>();
}
/**
* 添加子图形
* @param shape 要添加的图形
*/
public void addShape(Shape shape) {
if (shape != null) {
shapes.add(shape);
}
}
/**
* 移除子图形
* @param shape 要移除的图形
* @return 如果移除成功则返回true否则返回false
*/
public boolean removeShape(Shape shape) {
return shapes.remove(shape);
}
/**
* 移除所有子图形
*/
public void clearShapes() {
shapes.clear();
}
/**
* 获取子图形列表
* @return 子图形列表
*/
public List<Shape> getShapes() {
return new ArrayList<>(shapes); // 返回副本,防止外部修改
}
@Override
public String getColor() {
return color;
}
@Override
public double getArea() {
double totalArea = 0.0;
for (Shape shape : shapes) {
totalArea += shape.getArea();
}
return totalArea;
}
@Override
public void display() {
System.out.println("CompositeShape [name=" + name + ", color=" + color + ", totalShapes=" + shapes.size() + ", totalArea=" + getArea() + "]");
System.out.println(" 子图形列表:");
for (int i = 0; i < shapes.size(); i++) {
System.out.print(" " + (i + 1) + ". ");
shapes.get(i).display();
}
}
@Override
public void enlarge(double factor) {
if (factor > 0) {
for (Shape shape : shapes) {
if (shape instanceof Resizable) {
((Resizable) shape).enlarge(factor);
}
}
}
}
@Override
public void shrink(double factor) {
if (factor > 0 && factor < 1) {
for (Shape shape : shapes) {
if (shape instanceof Resizable) {
((Resizable) shape).shrink(factor);
}
}
}
}
@Override
public String getSizeInfo() {
return "CompositeShape '" + name + "' with " + shapes.size() + " shapes, total area: " + getArea();
}
/**
* 获取复合图形的名称
* @return 名称
*/
public String getName() {
return name;
}
/**
* 设置复合图形的名称
* @param name 新的名称
*/
public void setName(String name) {
this.name = name;
}
/**
* 设置颜色
* @param color 新的颜色
*/
public void setColor(String color) {
this.color = color;
}
/**
* 获取子图形的数量
* @return 子图形数量
*/
public int getShapeCount() {
return shapes.size();
}
}