У меня получился следующий набор классов:
- Program – наш корень компоновки, который строит весь граф объектов;
- Good – описывает товар;
- Order – описывает заказ;
- FreeOrder – описывает заказ, за который не нужно платить;
- Request – описывает запрос к машине;
- Router – преобразует запрос в команду, а также берёт на себя обязанность формирования заказа;
- WendingMachine – “помойка”, которая содержит в себе всё, что не захотелось на этом этапе выносить в другие классы. Содержит в себе товары и баланс;
- ConsoleCommandInput – читает строку с консоли и преобразует её в команду с помощью роутера;
- Commands:
- AddMoney;
- BuyGood;
- GetChange;
- ShowCommands;
- Login;
Есть также у нас чистые абстракции, в виде интерфейсов:
- IOrder;
- ICommand;
- ICommandInput;
Они позволяют нам абстрагироваться во многих частях кода от того, откуда приходит запрос, какой тип заказа у нас и какую команду нужно выполнять.