Sto sviluppando un programma per generare caratteri LARP in java e ho avuto un problema.
Inizialmente avevo pianificato di utilizzare un decoratore per iterare attraverso i potenziali "ruoli" (effettivamente classi), e quindi da questo calcolare i costi per ogni abilità a seconda della combinazione dei ruoli e del negozio che nel personaggio. Potresti essere un Java Coder / Nerdfighter, se questi sono i tuoi due ruoli, o potresti semplicemente avere il ruolo SysAdmin ecc.
Quindi ho prototipato un metodo per acquistare un'abilità che richiedeva la ricerca di competenze in un database che conteneva il loro nome e il loro costo. Ecco l'intoppo: se ho valutato i costi, non ho mai bisogno di cercare il database, quindi nessuna modifica nel db viene trasferita (se l'abilità costa su un SysAdmin andare giù mi piacerebbe conoscere). Oltre a questo, potrei acquistare solo una minima parte delle competenze disponibili, quindi conserverò dati non necessari sui costi delle competenze e inoltre il personaggio dovrebbe solo conoscere le loro abilità, non tutte le abilità. Inoltre, il decoratore decorerebbe solo i costi delle abilità, nient'altro.
Invece ho bisogno di una fabbrica che abbia due opzioni per costruire il personaggio, qualcosa come:
public static CharacterFactory multiRolePlayerCharacter(Role firstRole, Role secondRole) {
/*Some code goes here*/
}
public static CharacterFactory singleRolePlayerCharacter(Role role) {
/*Some more code goes here*/
}
Ma questo sembra molto meno estendibile rispetto al decoratore. Se il gioco dovesse mai cambiare in modo da poter multire il doppio più tardi (e Java Coder / Nerdfighter / SysAdmin è un ruolo consentito), allora ho bisogno di rielaborare dall'alto per aggiungere una nuova fabbrica. Inoltre non so come ogni fabbrica differisce inoltre forse da una bandiera per dire se è multiruolo o meno, e un'altra variabile per contenere il secondo. Che non sembra molto.
Quindi sembra che in entrambi i casi io perda: Decorator aggiunge estensibilità a lungo termine mentre metto a riposo le mie classi / oggetti, e Factory funzionerà per iniziare ma resisterà al cambiamento.
Quindi come faccio a sapere quale scegliere? C'è un modo per combinare i due?