RemoteRendererProxy.java
// 5. RemoteRendererProxy.java
package com.example.renderer.proxy;
/**
* 远程渲染器代理类,实现了代理模式。
*
* <p>主要功能:
* <ul>
* <li>在调用实际渲染方法前后添加日志记录</li>
* <li>控制对真实渲染器的访问</li>
* <li>可以添加额外的网络通信逻辑</li>
* </ul>
*
* <p>典型用法:
* <pre>{@code
* Renderer realRenderer = new SwingRenderer();
* Renderer proxy = new RemoteRendererProxy(realRenderer);
* proxy.drawCircle(100,100,50); // 通过代理调用
* }</pre>
*
* @author DeepSeek-Coder
* @version 1.0
* @see Renderer 渲染器接口
* @see Proxy 代理模式
* @since 2025-06-24
*/
import com.example.renderer.bridge.Renderer;
import java.util.Objects;
/**
* 远程渲染器代理实现类
*/
public class RemoteRendererProxy implements Renderer {
private final Renderer realRenderer;
private String strokeColor = "black";
private String fillColor = "none";
private int strokeWidth = 1;
/**
* 创建远程渲染器代理实例。
*
* @param realRenderer 实际渲染器实例(非null)
* @throws NullPointerException 如果realRenderer为null
* @author Aider+DeepSeek
* @since 2025-06-24
*/
public RemoteRendererProxy(Renderer realRenderer) {
Objects.requireNonNull(realRenderer, "Real renderer cannot be null");
this.realRenderer = realRenderer;
}
/**
* 代理绘制圆形操作,添加远程调用日志。
*
* @param x 圆心x坐标
* @param y 圆心y坐标
* @param radius 圆形半径(必须>0)
* @throws IllegalArgumentException 如果半径不合法
* @author Aider+DeepSeek
* @since 2025-06-24
*/
public void drawCircle(int x, int y, int radius) {
System.out.println("[Proxy] Sending drawCircle to remote...");
int retries = 3;
while (retries-- > 0) {
try {
realRenderer.drawCircle(x, y, radius);
return;
} catch (Exception e) {
if (retries == 0) throw e;
System.out.println("远程调用失败,剩余重试次数: " + retries);
}
}
}
/**
* 代理绘制矩形操作,添加远程调用日志。
*
* @param x 左上角x坐标
* @param y 左上角y坐标
* @param width 矩形宽度(必须>0)
* @param height 矩形高度(必须>0)
* @author Aider+DeepSeek
* @since 2025-06-24
*/
public void drawRectangle(int x, int y, int width, int height) {
System.out.println("[Proxy] Sending drawRectangle to remote...");
realRenderer.drawRectangle(x, y, width, height);
}
/**
* 代理绘制三角形操作,添加远程调用日志。
*
* @param x1 第一个顶点x坐标
* @param y1 第一个顶点y坐标
* @param x2 第二个顶点x坐标
* @param y2 第二个顶点y坐标
* @param x3 第三个顶点x坐标
* @param y3 第三个顶点y坐标
* @author Aider+DeepSeek
* @since 2025-06-24
*/
@Override
public void drawTriangle(int x1, int y1, int x2, int y2, int x3, int y3) {
System.out.printf("Remote call: drawTriangle(%d, %d, %d, %d, %d, %d)\n", x1, y1, x2, y2, x3, y3);
realRenderer.drawTriangle(x1, y1, x2, y2, x3, y3);
}
@Override
public void setStyle(String stroke, String fill, int width) {
this.strokeColor = stroke;
this.fillColor = fill;
this.strokeWidth = width;
realRenderer.setStyle(stroke, fill, width);
}
@Override
public void drawEllipse(int x, int y, int width, int height) {
System.out.printf("Remote call: drawEllipse(%d, %d, %d, %d)\n", x, y, width, height);
realRenderer.drawEllipse(x, y, width, height);
}
@Override
public Object getContext() {
return realRenderer.getContext();
}
@Override
public void beginFrame() {
realRenderer.beginFrame();
}
@Override
public void endFrame() {
realRenderer.endFrame();
}
}