@startuml !theme plain skinparam linetype ortho skinparam classAttributeIconSize 0 skinparam ClassFontStyle bold skinparam DefaultFontName Inter skinparam DefaultFontSize 14 skinparam MaxMessageSize 200 skinparam Nodesep 25 skinparam Padding 2 skinparam Ranksep 50 skinparam RoundCorner 0 class main as "main()" hide main circle hide main members exception Exception { Exception(const char* fmt, ...) +what() : const char* #error : char* #va_format(va_list args, const char* fmt) } class FileReader <> { +open(url) : File& } interface File { #open(string url) +close() +read() : string #clone() const : File* } class LocalFile { -static instance : LocalFile } class HTTPFile { -static instance : HTTPFile } class Canvas { + get_tile(x, y) + set_tile(x, y) } class Tile class TileFactory class TileBehavior class GrayTileBehavior class RedTileBehavior class BlueTileBehavior class YellowTileBehavior class Artist class Deserializer class ArtistDeserializer class CanvasDeserializer package CPR { } package SDL2 { } interface Parser { +parse(File) } class CSVParser class XMLParser class TXTParser File <|.. LocalFile File <|.. HTTPFile File <. FileReader File .> FileReader Canvas "1" -> "*" Tile TileBehavior <|-- GrayTileBehavior TileBehavior <|-- RedTileBehavior TileBehavior <|-- BlueTileBehavior TileBehavior <|-- YellowTileBehavior Parser <|-- CSVParser Parser <|-- TXTParser Parser <|-- XMLParser Deserializer <|-- ArtistDeserializer Deserializer <|-- CanvasDeserializer HTTPFile ..> CPR TileFactory --> Tile @enduml