Sì, usare qualcosa come il modello di strategia o adattatore sembra sensato qui.
-
Definisci un'interfaccia (o una famiglia di interfacce) che descriva tutte le operazioni di persistenza della tua logica aziendale.
-
Crea implementazioni di questa interfaccia per un back-end del database e il back-end del file.
-
All'avvio dell'applicazione, utilizzare le tecniche di dipendenza dipendente per fornire l'implementazione corretta alla logica aziendale, a seconda dello stato della licenza. Questo può essere semplice come
IRepository repo = (isTrialVersion) ? new FileRepository("data.txt")
: new DatabaseRepository("connection string");
runApplication(repo, otherConfiguration);
Se l'interfaccia di persistenza è più complicata e deve essere costituita da più interfacce, è possibile iniettare un oggetto di facciata o di fabbrica astratta.
Il nome esatto del pattern che usi non è importante, la parte rilevante è "usa un'interfaccia e fornisci l'implementazione corretta al runtime".
Se la versione demo e la versione completa sono distribuite come programmi separati, è possibile selezionare l'implementazione corretta al momento della compilazione utilizzando tecniche di compilazione condizionale. Questo è probabilmente eccessivo nella maggior parte dei casi, ma potrebbe essere un'opzione valida, ad es. in C ++. Nota che la compilazione condizionale complicherà i test.
Questa risposta presuppone che tu sia interessato a una soluzione elegante. È comunque facilmente fendibile. Ma non c'è una buona soluzione per evitare il cracking se dai il tuo software ad altre persone. Se ciò ti riguarda, considera la distribuzione delle parti dipendenti dalla licenza come una libreria separata (DLL) o utilizza un modello di distribuzione SaaS.