The original use case from back 2016 is that back in a day, smart contracts had no way to interact to incoming token transfer. (This has been now fixed with ERC-777 token standard and send()).
For you to interact with a smart contract with an ERC-20 token
You need to approve() amount of tokens on a smart contract address
You call a smart function that then ...