Hướng dẫn Java Design Pattern – Strategy

Có một vài trường hợp, các lớp chỉ khác nhau về hành vi của chúng. Trong trường hợp như thế, sáng kiến tốt là tất cả chúng ta sẽ biệt lập các thuật toán trong các lớp biệt lập để có khả năng lựa chọn các thuật toán khác nhau trong thời gian chạy (run-time). Sáng kiến này được gọi là Strategy Pattern, một pattern giúp tất cả chúng ta khắc phục vấn đề về sự biến đổi, cũng giống như State Design Pattern.

Strategy Pattern là gì?

Define α family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from the clients that use it.

Strategy Pattern là một trong những Pattern thuộc nhóm hành vi (Behavior Pattern). Nó cho phép khái niệm tập hợp các thuật toán, đóng gói từng thuật toán lại, & đơn giản biến đổi linh động các thuật toán bên trong object. Strategy cho phép thuật toán thay đổi độc lập khi người dùng sử dụng chúng.

Ý nghĩa thực sự của Strategy Pattern là giúp tách rời phần giải quyết một tính năng rõ ràng và cụ thể ra khỏi đối tượng. Sau đó tạo nên một tập hợp các thuật toán để giải quyết tính năng đó & lựa chọn thuật toán nào mà tất cả chúng ta thấy chính xác nhất khi thực thi chương trình. Mẫu kiến trúc này hay được sử dụng để thay thế cho sự kế thừa, khi mong muốn chấm hết việc theo dõi & căn chỉnh một tính năng qua nhiều lớp con.

Xem Thêm  Ghi vào tệp bằng Python - ghi dữ liệu vào tệp

Seting Strategy Pattern như vậy nào?

Các thành phần gia nhập Strategy Pattern:

  • Strategy : khái niệm các hành vi có thể có của một Strategy.
  • ConcreteStrategy : seting các hành vi rõ ràng và cụ thể của Strategy.
  • Context : chứa một tham chiếu đến đối tượng Strategy & nhận các yêu cầu từ Client, các yêu cầu này sau đó được ủy quyền cho Strategy thực hiện.

Chẳng hạn Strategy Pattern với áp dụng xếp đặt

Chương trình của các bạn phân phối nhiều giải thuật xếp đặt khác nhau: quick sort, merge sort, selection sort, heap sort, tim sort, …. Tùy vào loại dữ liệu, số lượng phần tử, … mà người dùng có thể chọn một giải thuật xếp đặt thích hợp.

SortStrategy.java


package com.gpcoder.patterns.behavioral.strategy.sort;

import java.util.Menu;

public interface SortStrategy {

	<Tvàgt; void sort(Menuvàlt;Tvàgt; items);
}

QuickSort.java


package com.gpcoder.patterns.behavioral.strategy.sort;

import java.util.Menu;

public class QuickSort implements SortStrategy {

	@Override
	public <Tvàgt; void sort(Menuvàlt;Tvàgt; items) {
		System.out.println("Quick sort");
	}
}

MergeSort.java


package com.gpcoder.patterns.behavioral.strategy.sort;

import java.util.Menu;

public class MergeSort implements SortStrategy {

	@Override
	public <Tvàgt; void sort(Menuvàlt;Tvàgt; items) {
		System.out.println("Merge sort");
	}
}

SelectionSort.java


package com.gpcoder.patterns.behavioral.strategy.sort;

import java.util.Menu;

public class SelectionSort implements SortStrategy {

	@Override
	public <Tvàgt; void sort(Menuvàlt;Tvàgt; items) {
		System.out.println("Selection sort");
	}
}

SortedList.java




SortStrategy.java


package com.gpcoder.patterns.behavioral.strategy.sort;

import java.util.ArrayList;
import java.util.Menu;

public class SortedList {

	private SortStrategy strategy;
	private Menuvàlt;Stringvàgt; items = new ArrayListvàlt;>();
	
	public void setSortStrategy(SortStrategy strategy) {
		this.strategy = strategy;
	}

	public void add(String name) {
		items.add(name);
	}

	public void sort() {
		strategy.sort(items);
	}
}

StrategyPatternExample.java


package com.gpcoder.patterns.behavioral.strategy.sort;

public class StrategyPatternExample {

	public static void main(String[] args) {

		SortedList sortedList = new SortedList();
		sortedList.add("Java Core");
		sortedList.add("Java Design Pattern");
		sortedList.add("Java Library");
		sortedList.add("Java Framework");

		sortedList.setSortStrategy(new QuickSort());
		sortedList.sort();

		sortedList.setSortStrategy(new MergeSort());
		sortedList.sort();
	}
}

Output của chương trình:


Quick sort
Merge sort

Chẳng hạn Strategy Pattern với áp dụng thanh toán online

Code cũng giống như chẳng hạn trên, các vui lòng xem trên Github.

Xem Thêm  Nhận ký tự đầu tiên từ một chuỗi trong JavaScript - javascript cách lấy ký tự đầu tiên của một chuỗi

Lợi nhuận của Strategy Pattern là gì?

  • Bảo đảm phép tắc Single responsibility principle (SRP) : một lớp khái niệm nhiều hành vi & chúng hiện ra dưới dạng với nhiều câu lệnh có điều kiện. Thay vì nhiều điều kiện, tất cả chúng ta sẽ chuyển các nhánh có điều kiện liên quan vào lớp Strategy riêng rẽ của nó.
  • Bảo đảm phép tắc Open/Closed Principle (OCP) : tất cả chúng ta đơn giản mở rộng & phối hợp hành vi mới mà không bao giờ thay đổi áp dụng.
  • Phân phối một sự thay thế cho kế thừa.

Sử dụng Strategy Pattern bao giờ?

  • Khi mong muốn có thể biến đổi các thuật toán được sử dụng bên trong một đối tượng tại thời điểm run-time.
  • Khi có một đoạn mã dễ biến đổi, & mong muốn tách chúng ra khỏi chương trình chính để đơn giản bảo dưỡng.
  • Tránh sự mớ bòng bong, khi phải hiện thực một tính năng nào đó qua quá nhiều lớp con.
  • Cần che dấu sự cầu kỳ, kết cấu bên trong của thuật toán.

So sánh Strategy Pattern vs State Pattern

Sự lệ thuộc (dependency):

  • State Pattern đi kèm với một tí lệ thuộc trong các lớp con, ví dụ một State biết về các tình trạng khác hiện ra trước/ sau nó. Chẳng hạn: tín hiệu đèn giao thông như đèn đỏ -> đèn xanh -> đèn vàng, áp dụng workflow nơi mà chúng có thể hiểu rằng bước trước & sau nó làm gì.
  • Strategy Pattern không có sự lệ thuộc như State. Bất kỳ loại tình trạng nào cũng có thể được khởi tạo một cách độc lập, chúng không hiểu rằng sự tồn tại của các Strategy khác. Chẳng hạn: người dùng có thể lựa chọn giải thuật xếp đặt, cách thức thanh toán, nén file rar/zip, xuất giải trình ra file excel/ csv, …
Xem Thêm  Câu lệnh SQL SELECT INTO - sql chọn vào bảng mới

Mục đích sử dụng (intent) :

  • Strategy Pattern quyết định cách thực hiện một số hành động, sử dụng Strategy khi tất cả chúng ta cần  giải đáp how.
  • Trong lúc State Pattern quyết định bao giờ để thực hiện chúng, sử dụng Strategy khi tất cả chúng ta cần  giải đáp when/ what (state or type).

Thời điểm khởi tạo (binding time):

  • Strategy Pattern là một mô hình khởi tạo một lần, không có sự luân chuyển tình trạng.
  • Trong lúc State  Pattern thì hoạt bát hơn (có thể nhiều lần), có sự luân chuyển từ tình trạng này sang tình trạng khác. State Pattern có thể coi là trường hợp mở rộng của Strategy Pattern.

Ebook đọc qua:

  • https://sourcemaking.com/design_patterns/strategy
  • https://refactoring.guru/design-patterns/strategy
  • https://www.javatpoint.com/strategy-pattern
  • https://www.tutorialspoint.com/design_pattern/strategy_pattern.htm
  • https://stackoverflow.com/questions/1658192/what-is-the-difference-between-strategy-design-pattern-and-state-design-pattern/
  • Design Patterns: Elements of Reusable Object-Oriented PM – GOF
  • Design Pattern for dummies

5.0

Nếu bạn thấy hay thì hãy chia sẻ nội dung cho mọi người nhé!

Shares

Phản hồi

comment

Viết một bình luận