×

Tạo các mẫu thiết kế Observer, Factory và Strategy trong Java

Trong quá trình phát triển phần mềm, các mẫu thiết kế thường được vay mượn từ bộ các mẫu thiết kế nổi tiếng để tạo ra phần mềm có cấu trúc rõ ràng và khả năng mở rộng cao. Ba mẫu thiết kế phổ biến trong Java là Observer, Factory và Strategy. Dưới đây là chi tiết về cách triển khai từng mẫu này trong Java.

Mẫu thiết kế Observer

Mẫu thiết kế Observer thích hợp cho các tình huống cần phản ứng thay đổi ở một đối tượng này khi có sự kiện xảy ra ở đối tượng khác. Giả sử chúng ta có một kịch bản đơn giản là một đối tượng Observable và nhiều đối tượng Observer đăng ký lắng nghe sự kiện.

import java.util.ArrayList;
import java.util.List;

// Định nghĩa interface Observer
interface Observer {
    void update(String message);
}

// Định nghĩa lớp Observable
class Observable {
    private List<Observer> observers = new ArrayList<>();
    private String message;

    // Phương thức để đăng ký Observer
    public void addObserver(Observer observer) {
        observers.add(observer);
    }

    // Phương thức để thông báo cập nhật
    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(message);
        }
    }

    // Phương thức để thay đổi trạng thái
    public void setMessage(String message) {
        this.message = message;
        notifyObservers();
    }
}

// Implement Observer
class ConcreteObserver implements Observer {
    private String name;

    public ConcreteObserver(String name) {
        this.name = name;
    }

    @Override
    public void update(String message) {
        System.out.println(name + " received message: " + message);
    }
}

// Sử dụng mẫu thiết kế Observer
public class ObserverPatternDemo {
    public static void main(String[] args) {
        Observable observable = new Observable();

        Observer observer1 = new ConcreteObserver("Observer 1");
        Observer observer2 = new ConcreteObserver("Observer 2");
        
        observable.addObserver(observer1);
        observable.addObserver(observer2);

        observable.setMessage("Hello Observers!");
    }
}

Mẫu thiết kế Factory

Đây là một mẫu thiết kế sáng tạo. Nó cho phép tạo các đối tượng mà không cần chỉ định lớp chính xác của đối tượng sẽ được tạo. Ví dụ, một nhà máy sản xuất đồ uống có thể sản xuất nhiều loại đồ uống khác nhau như trà, cà phê dựa trên yêu cầu.

// Định nghĩa interface đồ uống
interface Drink {
    void prepare();
}

// Implement các loại đồ uống cụ thể
class Tea implements Drink {
    @Override
    public void prepare() {
        System.out.println("Preparing Tea.");
    }
}

class Coffee implements Drink {
    @Override
    public void prepare() {
        System.out.println("Preparing Coffee.");
    }
}

// Định nghĩa lớp Factory
class DrinkFactory {
    public Drink makeDrink(String type) {
        if (type.equalsIgnoreCase("TEA")) {
            return new Tea();
        } else if (type.equalsIgnoreCase("COFFEE")) {
            return new Coffee();
        }
        return null;
    }
}

// Sử dụng mẫu thiết kế Factory
public class FactoryPatternDemo {
    public static void main(String[] args) {
        DrinkFactory drinkFactory = new DrinkFactory();

        Drink tea = drinkFactory.makeDrink("TEA");
        tea.prepare();

        Drink coffee = drinkFactory.makeDrink("COFFEE");
        coffee.prepare();
    }
}

Mẫu thiết kế Strategy

Mẫu thiết kế Strategy cho phép chọn một thuật toán tại runtime từ nhiều thuật toán trong danh sách. Chẳng hạn như một hệ thống thanh toán có thể thực hiện các chiến lược thanh toán khác nhau như thanh toán qua thẻ tín dụng, PayPal hoặc Bitcoin.

// Định nghĩa interface Strategy
interface PaymentStrategy {
    void pay(int amount);
}

// Implement các lớp cụ thể của Strategy
class CreditCardPayment implements PaymentStrategy {
    @Override
    public void pay(int amount) {
        System.out.println("Paid " + amount + " using Credit Card.");
    }
}

class PayPalPayment implements PaymentStrategy {
    @Override
    public void pay(int amount) {
        System.out.println("Paid " + amount + " using PayPal.");
    }
}

// Định nghĩa lớp Context sử dụng Strategy
class ShoppingCart {
    private PaymentStrategy paymentStrategy;

    public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
        this.paymentStrategy = paymentStrategy;
    }

    public void checkout(int amount) {
        paymentStrategy.pay(amount);
    }
}

// Sử dụng mẫu thiết kế Strategy
public class StrategyPatternDemo {
    public static void main(String[] args) {
        ShoppingCart cart = new ShoppingCart();
        
        // Thanh toán bằng thẻ tín dụng
        cart.setPaymentStrategy(new CreditCardPayment());
        cart.checkout(100);

        // Thanh toán bằng PayPal
        cart.setPaymentStrategy(new PayPalPayment());
        cart.checkout(200);
    }
}

Qua bài viết trên, chúng ta đã tìm hiểu về ba mẫu thiết kế phổ biến trong Java và cách triển khai chúng. Những mẫu thiết kế này giúp tăng cường cấu trúc code và mở rộng tính năng của phần mềm một cách dễ dàng hơn.

Comments