User
- name
- balance
Group
- members
- expenses
+ addExpense()
Expense
- amount
- paidBy
«interface»
SplitStrategy
+ split(amt, n)
EqualSplit
+ split()
BalanceSheet
- owes: Map
+ settle()
Model the domain
1interface SplitStrategy { List<Money> split(Money amt, int n); }2class EqualSplit implements SplitStrategy { ... } // + Exact, Percent34class Group { List<User> members; List<Expense> expenses; }5class Expense { Money amount; User paidBy; SplitStrategy how; }
State
Groupmembers + expenses