@startuml
' 渲染器相关类
interface Renderer {
+setStyle(stroke, fill, width)
+getContext(): Object
+beginFrame()
+endFrame()
+drawCircle(x, y, radius)
+drawRectangle(x, y, width, height)
+drawEllipse(x, y, width, height)
+drawTriangle(x1, y1, x2, y2, x3, y3)
}
class SwingRenderer {
-Graphics2D g
+setGraphics(g)
}
class SVGRenderer {
-StringBuilder svgBuilder
+getSVG(): String
}
class LegacyRendererAdapter {
-LegacyRenderer legacyRenderer
}
class RemoteRendererProxy {
-Renderer realRenderer
+RemoteRendererProxy(realRenderer)
}
' 图形相关类
interface Shape {
+draw(renderer)
}
class Circle {
-int x, y, radius
}
class Rectangle {
-int x, y, width, height
}
class Triangle {
-int x1, y1, x2, y2, x3, y3
}
class Ellipse {
-int x, y, width, height
}
' 工厂模式
interface ShapeFactory {
+createCircle(x, y, radius): Circle
+createRectangle(x, y, width, height): Rectangle
+createTriangle(x1, y1, x2, y2, x3, y3): Triangle
+createEllipse(x, y, width, height): Ellipse
}
' 命令模式
interface Command {
+execute()
+undo()
+redo()
}
class UndoManager {
-Stack<Command> undoStack
-Stack<Command> redoStack
+executeCommand(cmd)
+undo()
+redo()
}
' 观察者模式
interface ShapeObserver {
+onShapeChanged()
}
class LoggingShapeObserver {
+onShapeChanged()
}
' 关系定义
Renderer <|-- SwingRenderer
Renderer <|-- SVGRenderer
Renderer <|-- LegacyRendererAdapter
Renderer <|-- RemoteRendererProxy
Shape <|-- Circle
Shape <|-- Rectangle
Shape <|-- Triangle
Shape <|-- Ellipse
LegacyRendererAdapter --> LegacyRenderer
RemoteRendererProxy --> Renderer
ShapeFactory ..> Circle
ShapeFactory ..> Rectangle
ShapeFactory ..> Triangle
ShapeFactory ..> Ellipse
UndoManager --> Command
LoggingShapeObserver ..|> ShapeObserver
@enduml
Renderer
: 定义统一的渲染接口SwingRenderer
: 基于Swing的实现SVGRenderer
: 生成SVG格式输出LegacyRendererAdapter
: 适配旧版渲染器RemoteRendererProxy
: 远程渲染代理Shape
: 图形基类接口Circle
/Rectangle
/Triangle
/Ellipse
: 具体图形实现ShapeFactory
: 工厂模式创建图形Command
/UndoManager
: 命令模式实现撤销重做ShapeObserver
: 观察者模式通知变化@startuml
' 1. 渲染器核心接口和实现
interface Renderer {
+setStyle(stroke, fill, width)
+getContext(): Object
+beginFrame()
+endFrame()
+drawCircle(x, y, radius)
+drawRectangle(x, y, width, height)
+drawEllipse(x, y, width, height)
+drawTriangle(x1, y1, x2, y2, x3, y3)
}
class SwingRenderer {
-Graphics2D graphics
+setGraphics(g: Graphics2D)
}
class SVGRenderer {
-StringBuilder svgBuilder
+getSVG(): String
}
class LegacyRendererAdapter {
-LegacyRenderer legacyImpl
+LegacyRendererAdapter(legacy: LegacyRenderer)
}
class RemoteRendererProxy {
-Renderer realRenderer
+RemoteRendererProxy(renderer: Renderer)
}
' 2. 图形相关类
interface Shape {
+draw(renderer: Renderer)
+move(dx: int, dy: int)
}
class Circle {
-int x, y, radius
+getRadius(): int
}
class Rectangle {
-int x, y, width, height
+getWidth(): int
+getHeight(): int
}
class Triangle {
-int x1, y1, x2, y2, x3, y3
}
class Ellipse {
-int x, y, width, height
}
' 3. 工厂模式
interface ShapeFactory {
+createCircle(x, y, radius): Circle
+createRectangle(x, y, width, height): Rectangle
+createTriangle(x1, y1, x2, y2, x3, y3): Triangle
+createEllipse(x, y, width, height): Ellipse
}
' 4. 命令模式
interface Command {
+execute()
+undo()
+redo()
}
class UndoManager {
-Stack<Command> undoStack
-Stack<Command> redoStack
+executeCommand(cmd: Command)
+undo()
+redo()
}
' 5. 观察者模式
interface ShapeObserver {
+onShapeChanged()
}
class LoggingShapeObserver {
-DateTimeFormatter formatter
+onShapeChanged()
}
' 6. 关系定义
Renderer <|-- SwingRenderer
Renderer <|-- SVGRenderer
Renderer <|-- LegacyRendererAdapter
Renderer <|-- RemoteRendererProxy
Shape <|-- Circle
Shape <|-- Rectangle
Shape <|-- Triangle
Shape <|-- Ellipse
LegacyRendererAdapter --> LegacyRenderer
RemoteRendererProxy --> Renderer
ShapeFactory ..> Circle
ShapeFactory ..> Rectangle
ShapeFactory ..> Triangle
ShapeFactory ..> Ellipse
UndoManager --> Command
LoggingShapeObserver ..|> ShapeObserver
@enduml
Renderer
接口Shape
接口LegacyRendererAdapter
适配LegacyRenderer
到Renderer
接口RemoteRendererProxy
代理真实的Renderer
实现ShapeFactory
负责创建各种图形对象UndoManager
管理Command
对象的执行历史LoggingShapeObserver
实现ShapeObserver
接口.puml
文件中# 生成PNG图片
plantuml class-diagram.puml -png
注意:需要先安装PlantUML,在Ubuntu上可以使用
sudo apt-get install plantuml