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