Глава[17]: Створення онлайн-системи платежів з абстракцією: Частина 2

pic

Designed By Freepik

Отже, давайте застосуємо те, що ми вивчили на практиці! Як щодо того, щоб створити онлайн платіжну систему, щоб справжньою мірою опанувати абстракцію? Це допоможе нам зрозуміти, як усе працює разом у реальному світі.

Приклад коду: Онлайн платіжна система

Ось як ви можете створити абстракцію для платіжної системи, де внутрішня логіка прихована, а користувач взаємодіє лише з простим сервісом.

 // Клас 1: Обробляє приховану логіку платіжного процесу  
class PaymentProcessor {  
 void process(double amount) {  
 System.out.println("З'єднання з банком...");  
 System.out.println("Шифрування платіжних даних...");  
 System.out.println("Обробка платежу на суму $" + amount);  
 System.out.println("Платіж успішний!");  
 }  
}  

// Клас 2: Надає простий інтерфейс для користувачів для здійснення платежів  
class PaymentService {  
 private PaymentProcessor processor = new PaymentProcessor(); // Приховуємо логіку  
 void makePayment(double amount) {  
 System.out.println("Ініціація платежу...");  
 processor.process(amount); // Приховуємо внутрішні деталі  
 }  
}  
public class Main {  
 public static void main(String[] args) {  
 // Користувач взаємодіє з PaymentService, а не з внутрішньою логікою  
 PaymentService service = new PaymentService();  
 service.makePayment(100.50); // Простіше та чистіше  
 }  
}

Що відбувається?

  • Клас 1 (PaymentProcessor): Містить усі складні деталі, такі як підключення до банку, шифрування даних і обробка платежів.
  • Клас 2 (PaymentService): Діє як місток між користувачем і внутрішньою логікою. Користувач не взаємодіє безпосередньо з процесором; він лише викликає makePayment.

Чому це краще?

  1. Простота у використанні: Користувачі не повинні знати, як працює обробка платежів — вони просто викликають метод.
  2. Безпека: Чутлива логіка прихована та не може бути доступною безпосередньо.

Ключове слово abstract

Тепер підвищимо рівень. Ключове слово abstract дозволяє визначити шаблон для класу. Уявіть це як вказівку: "Ось що кожен платіжний метод повинен робити, але я не скажу, як це робити."
Ви розбираєтесь у цьому самі.

З допомогою абстракції ми визначаємо загальну поведінку для всіх платіжних методів, при цьому кожен з них має свою власну конкретну реалізацію.

Приклад коду: Абстрактний клас для платіжних методів

Ось як можна використовувати ключове слово abstract, щоб створити шаблон для різних платіжних методів (наприклад, кредитної картки та PayPal).

 // Клас 1: Абстрактний шаблон для платежів  
abstract class Payment {  
 // Абстрактний метод: підкласи повинні реалізувати це  
 abstract void process(double amount);  

// Звичайний метод: Загальна функціональність для всіх типів платежів  
 void paymentDetails() {  
 System.out.println("Обробка платежу безпечно...");  
 }  
}  


// Клас 2: Обробляє платежі за допомогою кредитної картки  
class CreditCardPayment extends Payment {  
 @Override  
 void process(double amount) {  
 paymentDetails(); // Повторне використання загальної логіки  
 System.out.println("Обробка платежу за кредитною карткою на суму $" + amount);  
 }  
}  


// Клас 3: Обробляє платежі через PayPal  
class PayPalPayment extends Payment {  
 @Override  
 void process(double amount) {  
 paymentDetails(); // Повторне використання загальної логіки  
 System.out.println("Обробка платежу через PayPal на суму $" + amount);  
 }  
}  


// Клас 4: Надає сервіс для користувачів  
class PaymentService {  
 private Payment payment; // Зберігає посилання на абстрактний клас Payment  
 PaymentService(Payment payment) {  
 this.payment = payment; // Користувач вибирає тип платежу  
 }  
 void makePayment(double amount) {  
 payment.process(amount); // Делегує обробку конкретному типу платежу  
 }  
}  


// Клас 5: Основний клас  
public class Main {  
 public static void main(String[] args) {  
 PaymentService service;  
 // Використовуємо платіж через кредитну картку  
 service = new PaymentService(new CreditCardPayment());  
 service.makePayment(150.75);  
 // Перемикаємося на платіж через PayPal  
 service = new PaymentService(new PayPalPayment());  
 service.makePayment(200.50);  
 }  
}

Що відбувається?

  • Клас 1 (Payment): Це абстрактний клас. Він визначає шаблон, якому повинні слідувати всі типи платежів (через метод process). Також він надає спільну функціональність, наприклад, paymentDetails().
  • Клас 2 та Клас 3 (CreditCardPayment і PayPalPayment): Ці підкласи реалізують конкретну логіку для обробки платежів, при цьому повторно використовують загальну функціональність.
  • Клас 4 (PaymentService): Цей клас взаємодіє з користувачем. Він використовує посилання на Payment, щоб викликати відповідну реалізацію в залежності від вибору користувача.

Чому використовувати абстрактні класи?

  1. Повторне використання коду: Спільна логіка (наприклад, paymentDetails()) визначена один раз в абстрактному класі і повторно використовується підкласами.
  2. Гнучкість: Ви можете додавати нові платіжні методи (наприклад, Google Pay), створюючи новий підклас, без необхідності змінювати існуючий код.

Обмеження абстрактних класів

  • Тільки одиничне успадкування: Клас може успадковувати лише один абстрактний клас. Якщо вам потрібно успадкувати кілька поведінок, потрібно використовувати інтерфейси (ми це розглянемо в Частині 3).
  • Часткова абстракція: Абстрактні класи можуть містити як абстрактні, так і не абстрактні методи, тому вони можуть не повністю забезпечувати абстракцію.

Підсумок

  • Абстрактний клас (Payment): Надає загальну структуру для всіх типів платежів.
  • Успадкування: CreditCardPayment та PayPalPayment успадковують від Payment і надають конкретні реалізації для методу process().
  • Поліморфізм: PaymentService працює з типом Payment, тому ви можете передати будь-який підклас Payment (наприклад, CreditCardPayment або PayPalPayment), що робить його гнучким та повторно використовуваним.

Це повинно дати вам чітке розуміння того, як абстракція працює з реальними прикладами! Дайте знати, якщо у вас є питання або потрібні додаткові пояснення. 😊

Коди можна знайти та завантажити за посиланням тут

.

.

.

Щасливого кодування!

Перекладено з: Chapter[17]: Creating an online payment system with abstraction: Part 2

Leave a Reply

Your email address will not be published. Required fields are marked *