Last active
December 20, 2017 15:20
-
-
Save blrobin2/c88301d1bf0138c3629afbd55b78f12f to your computer and use it in GitHub Desktop.
Using a proxy for persistence in TypeScript
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| class Account {} | |
| interface Bank { | |
| getAccounts(): Account[] | |
| setAccounts(accounts: Account[]): void | |
| } | |
| // "Plain Old JavaScript Object" implementing abstraction | |
| class BankImpl implements Bank { | |
| private accounts: Account[]; | |
| getAccounts(): Account[] { | |
| return this.accounts; | |
| } | |
| setAccounts(accounts: Account[]): void { | |
| this.accounts = []; | |
| accounts.forEach(account => this.accounts.push(account)); | |
| } | |
| } | |
| // Bank Proxy | |
| class BankProxyHandler { | |
| private proxy: Bank; | |
| private constructor(bank: Bank) { | |
| this.proxy = new Proxy(bank, this); | |
| } | |
| public static invoke(bank: Bank) { | |
| return new BankProxyHandler(bank).proxy; | |
| } | |
| get(bank: Bank, methodName: string) { | |
| return (accounts: Account[]) => { | |
| if (methodName === 'getAccounts') { | |
| bank.setAccounts(this.getAccountsFromDatabase()); | |
| return bank.getAccounts(); | |
| } | |
| if (methodName === 'setAccounts') { | |
| bank.setAccounts(accounts); | |
| this.setAccountsToDatabase(bank.getAccounts()); | |
| return null; | |
| } | |
| throw Error('Invalid method'); | |
| } | |
| } | |
| protected getAccountsFromDatabase(): Account[] { | |
| console.log('I was called'); | |
| return [] | |
| } | |
| protected setAccountsToDatabase(accounts: Account[]): void { | |
| console.log('So was I'); | |
| } | |
| } | |
| const bank: Bank = BankProxyHandler.invoke(new BankImpl); | |
| const accounts: Account[] = bank.getAccounts(); // I was called | |
| bank.setAccounts(accounts); // So was I |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment