A great resource for this is to just look at the definitions of transfer and withdraw for the Currency trait inside of the Substrate repo.
/// Transfer some liquid free balance to another staker.
/// This is a very high-level function. It will ensure all appropriate fees are paid
/// and no imbalance in the system remains.
) -> DispatchResult;
/// Removes some free balance from `who` account for `reason` if possible. If `liveness` is
/// `KeepAlive`, then no less than `ExistentialDeposit` must be left remaining.
/// This checks any locks, vesting, and liquidity requirements. If the removal is not possible,
/// then it returns `Err`.
/// If the operation is successful, this will return `Ok` with a `NegativeImbalance` whose value
/// is `value`.
) -> Result<Self::NegativeImbalance, DispatchError>;
Most runtimes use the
pallet_balances inside the Substrate repo that implements the Currency trait so reading the implementation of both methods in this pallet can also help a lot to understand how they work and what they do.