I see two fundamental kinds of design activities.
There is a decomposition in primary system pieces. So you've already got some idea of a separation of the presention pieces from the rest of your system. You'll probably have some Business Logic and Persistence too. First important question, how much Business Logic do you really have. Some systems are little more than a thin skin in front of a simple database, hardly any true business logic. Others have very major pieces of Business Logic that are to some extent independent.
If you have major semi-independent pieces they might best communicate via events and message queues. So indentify whether you have pieces that need that kind of decoupled relationship, and that leads to identifying the events and the payloads of those events. Here's where the Fowler referenced in another answer becomes relevent.
Next drill into the Business Logic pieces. Interfaces and Abstract Classes etc. are techniques for structuring the implementation of complexity. Separate your code so that details are hidden and flexibility is enabled. I see this as being an OO design exercise, there are plenty of books about that, for example head first.