RemoteRendererProxy.java
package com.example.graphics.proxy;
import com.example.graphics.model.Circle;
import com.example.graphics.model.Line;
import com.example.graphics.model.Rectangle;
import com.example.graphics.model.Triangle;
import com.example.graphics.render.Renderer;
import com.example.graphics.render.SwingRenderer;
/**
* Proxy for remote rendering operations.
* This implements both the RemoteRenderer interface and our local Renderer interface.
* Implementation of the Proxy pattern.
*/
public class RemoteRendererProxy implements RemoteRenderer, Renderer {
private RemoteRenderer remoteRenderer;
private SwingRenderer localRenderer;
private boolean connected;
/**
* Constructor initializes the proxy
*/
public RemoteRendererProxy() {
this.connected = false;
}
/**
* 设置本地渲染器,用于在远程渲染的同时在本地GUI显示
* @param localRenderer 本地渲染器
*/
public void setLocalRenderer(SwingRenderer localRenderer) {
this.localRenderer = localRenderer;
}
/**
* Connect to the remote renderer
* @return true if connection was successful, false otherwise
*/
public boolean connect() {
if (!connected) {
try {
System.out.println("Connecting to remote rendering service...");
// Simulate connection setup
Thread.sleep(500);
remoteRenderer = new RemoteRendererImpl();
connected = true;
System.out.println("Connected to remote rendering service.");
return true;
} catch (Exception e) {
System.err.println("Failed to connect to remote rendering service: " + e.getMessage());
return false;
}
}
return true;
}
/**
* Disconnect from the remote renderer
*/
public void disconnect() {
if (connected) {
System.out.println("Disconnecting from remote rendering service...");
// Simulate disconnection
try {
Thread.sleep(200);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
remoteRenderer = null;
connected = false;
System.out.println("Disconnected from remote rendering service.");
}
}
/**
* Check if the proxy is connected to the remote renderer
* @return true if connected, false otherwise
*/
public boolean isConnected() {
return connected;
}
/**
* Ensure connection before performing operations
* @throws IllegalStateException if not connected
*/
private void ensureConnected() {
if (!connected) {
throw new IllegalStateException("Not connected to remote rendering service");
}
}
@Override
public void renderCircle(Circle circle) {
ensureConnected();
remoteRenderer.renderCircle(circle);
// 同时在本地GUI显示
if (localRenderer != null) {
localRenderer.renderCircle(circle);
}
}
@Override
public void renderRectangle(Rectangle rectangle) {
ensureConnected();
remoteRenderer.renderRectangle(rectangle);
// 同时在本地GUI显示
if (localRenderer != null) {
localRenderer.renderRectangle(rectangle);
}
}
@Override
public void renderLine(Line line) {
ensureConnected();
remoteRenderer.renderLine(line);
// 同时在本地GUI显示
if (localRenderer != null) {
localRenderer.renderLine(line);
}
}
@Override
public void renderTriangle(Triangle triangle) {
ensureConnected();
remoteRenderer.renderTriangle(triangle);
// 同时在本地GUI显示
if (localRenderer != null) {
localRenderer.renderTriangle(triangle);
}
}
@Override
public void clear() {
ensureConnected();
remoteRenderer.clear();
// 同时在本地GUI清除
if (localRenderer != null) {
localRenderer.clear();
}
}
@Override
public void display() {
ensureConnected();
remoteRenderer.display();
// 同时在本地GUI显示
if (localRenderer != null) {
localRenderer.display();
}
}
}