Circle.java

/**
 * Circle 类实现了圆形图形的具体表示和操作。
 * 
 * <p>作为 Shape 接口的实现类,它提供了圆形的核心功能:
 * <ul>
 *   <li>存储圆心坐标(x,y)和半径(radius)</li>
 *   <li>通过 render() 方法使用指定渲染器绘制圆形</li>
 *   <li>支持通过 move() 方法移动圆形位置</li>
 *   <li>支持通过 accept() 方法接受访问者操作</li>
 * </ul>
 * 
 * <p>构造器参数验证:
 * <ul>
 *   <li>半径必须为正数,否则抛出 IllegalArgumentException</li>
 * </ul>
 * 
 * <p>典型用法:
 * <pre>{@code
 * Circle circle = new Circle(100, 100, 50); // 创建圆形
 * circle.render(renderer); // 绘制圆形
 * circle.move(10, 10); // 移动圆形
 * }</pre>
 * 
 * @author DeepSeek-Coder
 * @version 1.0
 * @see Shape 图形接口
 * @see SwingRenderer Swing渲染实现
 * @since 2025-06-24
 */
package com.example.renderer.factory;
import com.example.renderer.bridge.Renderer;
import com.example.renderer.visitor.ExportVisitor;


/**
 * 圆形图形实现类,表示一个由圆心坐标和半径定义的圆形。
 * 
 * <p>实现了Shape接口的所有方法:
 * <ul>
 *   <li>render(): 使用渲染器绘制圆形</li>
 *   <li>move(): 移动圆形位置</li>
 *   <li>accept(): 接受访问者访问</li>
 * </ul>
 * 
 * @see Shape 图形接口
 * @author liying
 * @since 1.0
 */
public class Circle implements Shape {
    private int x, y, radius;

    /**
     * 无参构造器,用于序列化和反射创建实例。
     * 创建后需要通过setter方法设置属性。
     * 
     * <p>注意:使用此构造器创建的圆形需要手动设置坐标和半径,
     * 否则可能导致渲染异常。
     */
    /**
     * 无参构造器,用于序列化和反射创建实例。
     * 
     * @author Aider+DeepSeek
     * @since 2025-06-24
     */
    public Circle() {}

    /**
     * 创建圆形实例并初始化属性。
     * 
     * @param x 圆心x坐标
     * @param y 圆心y坐标
     * @param radius 圆形半径(必须>0)
     * @throws IllegalArgumentException 如果半径不是正数
     */
    public Circle(int x, int y, int radius) {
        if (radius <= 0) {
            throw new IllegalArgumentException("Radius must be positive (was " + radius + ")");
        }
        this.x = x;
        this.y = y;
        this.radius = radius;
    }

    @Override
    public void render(Renderer renderer) {
        renderer.drawCircle(x, y, radius);
    }

    @Override
    public void accept(ExportVisitor visitor) {
        visitor.visitCircle(this);
    }

    /**
     * 移动圆形位置。
     * 
     * @param dx X轴方向的移动距离(像素)
     * @param dy Y轴方向的移动距离(像素)
     * @author Aider+DeepSeek
     * @since 2025-06-24
     */
    @Override
    public void move(int dx, int dy) {
        x += dx;
        y += dy;
    }

    /**
     * 获取圆心x坐标。
     * 
     * @return 圆心x坐标值
     * @author Aider+DeepSeek
     * @since 2025-06-24
     */
    public int getX() { return x; }

    /**
     * 获取圆心y坐标。
     * 
     * @return 圆心y坐标值
     * @author Aider+DeepSeek
     * @since 2025-06-24
     */
    public int getY() { return y; }

    /**
     * 获取圆形半径。
     * 
     * @return 圆形半径值
     * @author Aider+DeepSeek
     * @since 2025-06-24
     */
    public int getRadius() { return radius; }

    /**
     * 获取圆形半径(简写方法)。
     * 
     * @return 圆形半径值
     * @see #getRadius() 等效方法
     * @author Aider+DeepSeek
     * @since 2025-06-24
     */
    public int getR() {
        return radius;
    }

    @Override
    public Circle clone() {
        try {
            return (Circle) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new AssertionError(); // 不会发生,因为我们实现了Cloneable
        }
    }

}