Итоги — Обработчик платежей
Часть раздела Объектно-ориентированное программирование путешествия по GO на Coddy. Урок 46 из 107.
Задание
ЛегкоДавайте создадим полноценную систему обработки платежей, которая объединяет все концепции полиморфизма из этой главы. Вы создадите различные методы оплаты, работающие через единый интерфейс, процессор, который принимает любой метод оплаты посредством внедрения зависимости, и обработаете несколько платежей через полиморфную коллекцию.
Вы организуете код в четырех файлах:
payment.go: Define интерфейсPaymentMethod, который требует методProcess(amount float64) string. Это контракт, которому должны соответствовать все типы платежей.methods.go: Create три типа платежей, каждый из которых реализует интерфейсPaymentMethod:CreditCardс полямиCardNumber(string) иHolderName(string). Его методProcessвозвращаетCredit Card [last 4 digits of CardNumber] charged $[amount] to [HolderName]PayPalс полемEmail. Его методProcessвозвращаетPayPal payment of $[amount] from [Email]BankTransferс полямиBankNameиAccountNumber. Его методProcessвозвращаетBank transfer of $[amount] via [BankName] (***[last 3 digits of AccountNumber])
processor.go: Create структуруPaymentProcessor, которая содержитPaymentMethod(внедренную зависимость). Включите конструкторNewPaymentProcessor, который принимаетPaymentMethod. Add методExecutePayment(amount float64) string, делегирующий выполнение внедренному методу оплаты. Также создайте functionProcessAll(payments []PaymentMethod, amount float64) []string, которая обрабатывает одну и ту же сумму через каждый метод оплаты в срезе и возвращает все результаты.main.go: Считайте данные платежей из входных данных, создайте все три типа платежей и продемонстрируйте как внедрение зависимости, так и полиморфные коллекции. Сначала используйтеNewPaymentProcessorс кредитной картой и выполните платеж. Затем соберите все три метода оплаты в срез и используйтеProcessAll, чтобы обработать их все со второй суммой. Выведите каждый результат в отдельной строке.
Будут предоставлены следующие входные данные:
- Строка 1: номер кредитной карты (например,
4532015112830366) - Строка 2: имя владельца карты
- Строка 3: электронная почта PayPal
- Строка 4: название банка
- Строка 5: номер счета (например,
987654321) - Строка 6: первая сумма платежа (для отдельного процессора)
- Строка 7: вторая сумма платежа (для пакетной обработки)
Форматируйте суммы с двумя знаками после запятой. Например, если заданы 4532015112830366, John Smith, john@email.com, Chase, 987654321, 99.99 и 50, результат должен быть следующим:
Credit Card 0366 charged $99.99 to John Smith
Credit Card 0366 charged $50.00 to John Smith
PayPal payment of $50.00 from john@email.com
Bank transfer of $50.00 via Chase (***321)Первая строка показывает отдельный платеж через внедренный процессор. Оставшиеся три строки показывают пакетную обработку через полиморфную коллекцию: одна и та же function ProcessAll единообразно обрабатывает все типы платежей, демонстрируя, как интерфейсы позволяют создавать гибкие и расширяемые системы обработки платежей.
Попробуйте сами
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Прочитать ввод
cardNumber, _ := reader.ReadString('\n')
cardNumber = strings.TrimSpace(cardNumber)
holderName, _ := reader.ReadString('\n')
holderName = strings.TrimSpace(holderName)
email, _ := reader.ReadString('\n')
email = strings.TrimSpace(email)
bankName, _ := reader.ReadString('\n')
bankName = strings.TrimSpace(bankName)
accountNumber, _ := reader.ReadString('\n')
accountNumber = strings.TrimSpace(accountNumber)
amount1Str, _ := reader.ReadString('\n')
amount1Str = strings.TrimSpace(amount1Str)
amount1, _ := strconv.ParseFloat(amount1Str, 64)
amount2Str, _ := reader.ReadString('\n')
amount2Str = strings.TrimSpace(amount2Str)
amount2, _ := strconv.ParseFloat(amount2Str, 64)
// TODO: Создать три типа платежей (CreditCard, PayPal, BankTransfer)
// TODO: Создать PaymentProcessor с кредитной картой, используя NewPaymentProcessor
// и выполнить платёж с amount1, затем вывести результат
// TODO: Создать срез PaymentMethod, содержащий все три типа платежей
// TODO: Использовать ProcessAll для обработки всех платежей с amount2
// и вывести каждый результат на отдельной строке
}
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП в Go
Внешние файлыРабочее пространство и модули GoПакеты и импортыЭкспортируемые и неэкспортируемые именаВведение в ООП в GoСтруктуры как классыОпределение методов структурПолучатели-указатели и получатели-значенияИнициализация структурФункции-конструкторыИтоги — Простой калькулятор4Интерфейсы
Введение в интерфейсыНеявная реализацияИнтерфейс как контрактПустой интерфейс (any)Утверждение типаПереключатель типовКомпозиция интерфейсовИнтерфейсы Stringer и ErrorПовторение: Калькулятор фигур7Инкапсуляция
Экспортируемые и неэкспортируемые поляИнкапсуляция на уровне пакетовГеттеры и сеттерыСокрытие информации в GoИтоги — Записи о студентах10Обобщения (Generics) (Go 1.18+)
Введение в GenericsПараметры типовОграничения типовОбобщенные структурыОбходной путь для обобщенных методовИтоги — Обобщенная коллекция13Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн Abstract FactoryПаттерн ObserverПаттерн Strategy2Глубокое погружение в типы и структуры
Базовые и составные типыОпределение пользовательских типовТеги структурАнонимные структурыВложенные структурыНулевые значения и значения по умолчаниюПовторение — Контактная книга5Композиция вместо наследования
Почему в Go нет наследованияОсновы встраивания структурПродвижение методовВстраивание нескольких структурВстраивание против агрегацииЗатенение встроенных методовИтоги — Иерархия сотрудников8Обработка ошибок и ООП
Интерфейс errorПользовательские типы ошибокОбертывание ошибок (fmt.Errorf)Sentinel-ошибкиerrors.Is() и errors.As()Panic, Defer и RecoverИтоги — Парсер файлов11Стандартная библиотека и ООП
io.Reader и io.Writersort.InterfaceИнтерфейс fmt.Stringerencoding/json со структурамиИнтерфейс http.HandlerПовторение: модели REST API14Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикMiddleware как Декоратор3Указатели и память
Основы указателей в GoУказатели на структурыПередача по значению и по ссылкеФункция new()Сборка мусора в GoПовторение: Конструктор связного списка6Полиморфизм в Go
Полиморфизм через интерфейсыУтиная типизация в GoПравила реализации интерфейсовПолиморфные коллекцииВнедрение зависимостейИтоги — Обработчик платежей9Конкурентность и ООП
Основы горутинКаналы и взаимодействиеБуферизованные и небуферизованные каналыОператор selectsync.Mutex и sync.RWMutexsync.WaitGroupПроектирование потокобезопасных структурПовторение — Worker PoolПотренируйтесь самостоятельно: Онлайн-компилятор Go