Ответ
Интерфейс определяет контракт, который должны реализовать классы. Я использовал его на прошлой неделе для абстракции платежного сервиса.
Пример интерфейса PaymentProcessor:
public interface PaymentProcessor {
/**
* Обрабатывает платеж.
* @throws PaymentException если платеж не прошел
*/
PaymentResult processPayment(PaymentRequest request) throws PaymentException;
/**
* Выполняет возврат средств.
* @throws RefundException если возврат невозможен
*/
void refundPayment(String transactionId) throws RefundException;
}
Ключевые принципы, которые я применил:
- Единая ответственность (Single Responsibility): Интерфейс отвечает только за операции с платежами.
- Четкие имена методов: Имена (
processPayment,refundPayment) точно описывают действие. - Использование Checked Exceptions: Ошибки бизнес-логики (например, отклоненный платеж) объявлены явно, чтобы клиентский код был вынужден их обработать.
- Документация (JavaDoc): Описан контракт и условия возникновения исключений.
Практическое применение: Этот интерфейс был реализован классами-адаптерами для разных провайдеров (StripePaymentProcessor, PayPalPaymentProcessor), что позволило легко менять и тестировать платежные системы.