@startuml 'https://www.plantuml.com/plantuml/uml/jLHBRnen4BxlhnXnoKObaNgDUWY4HoCXWbXogAeUpDe5DtvGFmehod-llVOsQzYqfvnOVz_CC8zlvbuRf8pbBCkoArWDbjFngiW4uaJlK4bWXTI6cDiV6evP1b0of7K4uGW03WEu6Kh921BmYsgwPYI0SylNHC4XULN9Qq-nsGPaySZHXW3bc_2UM54QAWMKYB4rAb-Un6TgifhyK4gXZRAbaIe_zAlhW6A5zddyRZAYsdareDvA-VSXXMUQw1FXuLEhHe9nrHIQ9BqbTBFzToRHqlak91L6vsV1HxPyUQ_OnKzBbIBilUA7k1FatQeG_QWDChGyUQT03wivuYJtEkh3eGzLFvtZzONV4WaiUV3EEprY5bUm90nvQUWjtMaFnL8__RwvQSyjPMBJBucpZhc0QOrmUvkeuGwi9Xr6xQc-PNC-dM1tyhitVPx3O3w2uVDiDbvbhHsSMf4ke4VWcEnDQPMMAa25j09FA2FW16_grpb1-CvKBIOEtJXpvw8JK16EgA1YqwA6bZ5YO5t_wA_VpdPM2c_x4ETtGRe1IeGRkaEDJHuTYwrgt_n2hCiaopSstd7foaVSAmfVt8BNViToOyiXlMoGdZReF8RGkc__ls5Hw_MSUnzxu4JQuqXKlPZ97JXlu-hLJZjUFCN3qt8CeyTYCHjyQMkdAAKY8wft35MfY1Bgs7s4OsLUHZFotQIWT--efMDccfZwpt91zlL7n1760JToWF6hSIXIvyBo-1awuclDxed0bhC_ ' Subject namespace Subject.js { class Subject{ - observers: Objects[] + constructor() + subscribe(observer: Object) + unsubscribe(observer: Object) + unsubscribeAll() + notifySubscribers() } interface Observer{ +update(source: string, ...others) } Subject .. Observer #blue;line.dotted;text:blue : notifySubscribers calls update } ' Targets namespace Target.js { class Target extends Subject.js.Subject implements Subject.js.Observer{ -visible: boolean -x: number -y: number -width: number -height: number -img: PImage +constructor(x:number, ,y:number, width:number) +getPoints(): number +draw() +isHit(x:number, y:number): boolean +shoot(x:number, y:number) +update(source: string, ...others) } class TeddyTarget extends Target { +constructor(x:number, y:number, width:number) +getPoints(): number } class DuckTarget extends Target{ +constructor(x:number, y:number, width:number) +getPoints(): number } class SquirrelTarget extends Target{ +constructor(x:number, y:number, width:number) +getPoints(): number } class TargetFactory<Singleton>{ +{static}getInstance(): TargetFactory +getTargetsByName(targetNames: string[], targetWidth:number, y:number) +getRandomTargets(numTargets:number, targetWidth:number, y:number) } note left of TargetFactory : getInstance is STATIC ' Relationships TargetFactory .. TeddyTarget #blue;line.dotted;text:blue : uses TargetFactory .. DuckTarget #blue;line.dotted;text:blue : uses TargetFactory .. SquirrelTarget #blue;line.dotted;text:blue : uses } ' Gun and Bullet namespace Gun.js { class Gun extends Subject.js.Subject { -cursor: PImage -shotSound: SoundFile -emptySound: SoundFile -totShots: number -remainingShots: number -bullets: Bullet[] +constructor(totShots:number) +draw() +reload() +getRemainingShots():number +shoot() } class Bullet { -x:number -y:number -visible: boolean -img:PImage +constructor(x:number, y:number) +draw() } Gun "1" -- "many" Bullet #blue;line.dotted;text:blue : contains } ' Score Display namespace ScoreDisplay.js { class ScoreDisplay implements Subject.js.Observer{ -img: PImage -shotLeft: number -score: number +constructor(initialBullets:number) +draw() +resetScore() +addScore(scoreToAdd:number) +setBullets(numBullets:number) +update(source: string, ...others) } } @enduml
Decode URL
Submit
amiga
aws-orange
black-knight
bluegray
blueprint
cerulean-outline
cerulean
crt-amber
crt-green
cyborg-outline
cyborg
hacker
lightgray
mars
materia-outline
materia
metal
mimeograph
minty
plain
reddress-darkblue
reddress-darkgreen
reddress-darkorange
reddress-darkred
reddress-lightblue
reddress-lightgreen
reddress-lightorange
reddress-lightred
sandstone
silver
sketchy-outline
sketchy
spacelab
spacelab-white
superhero-outline
superhero
toy
united
vibrant
🎉 Discover the future PlantUML Web Editor! 🚀
PNG
SVG
ASCII Art