1. Template Method Pattern là gì

Trong phát triển phần mềm, Mẫu Phương thức Mẫu là một mẫu thiết kế hành vi mà xác định kết cấu của một thuật toán và trì hoãn một số bước để được triển khai trong các lớp con. Điều này cho phép các lớp con triển khai hành vi của họ tại các bước cụ thể mà không thay đổi cấu trúc của thuật toán.

2. Đặc điểm và Ưu điểm của Mẫu Phương thức Mẫu

Các đặc điểm và ưu điểm của Mẫu Phương thức Mẫu bao gồm:

  • Xác định cấu trúc của một thuật toán và trì hoãn việc triển khai các bước cụ thể đến các lớp con.
  • Cho phép các lớp con định nghĩa lại các bước cụ thể của thuật toán mà không làm thay đổi cấu trúc của nó.
  • Cung cấp cách đóng gói thuật toán, làm cho nó độc lập với các chi tiết triển khai cụ thể.
  • Giảm thiểu việc lặp mã và nâng cao khả năng tái sử dụng mã.

3. Ví dụ về Ứng dụng Thực tế của Mẫu Phương thức Mẫu

Mẫu Phương thức Mẫu có nhiều ứng dụng thực tế trong phát triển phần mềm. Một số ví dụ điển hình bao gồm:

  • Các phương thức Hook trong các frameworks: Các phương thức Hook cung cấp các điểm mở rộng tại các bước cụ thể của một thuật toán, cho phép các lớp con mở rộng khi cần thiết.
  • Các phương thức mẫu cho các hoạt động cơ sở dữ liệu: Ví dụ, trong các hoạt động cơ sở dữ liệu, việc kết nối, mở giao dịch, thực thi các câu lệnh SQL, đóng kết nối, v.v., có thể được trừu tượng hóa như các phương thức mẫu để được triển khai bởi các lớp con.
  • Xử lý sự kiện trong ứng dụng GUI: Xử lý sự kiện trong ứng dụng GUI thường tuân theo các quy tắc và quy trình cụ thể, có thể triển khai bằng cách sử dụng Mẫu Phương thức Mẫu.

4. Triển khai Mẫu Phương thức Mẫu trong Golang

4.1. Sơ đồ lớp UML

Mẫu Phương thức Mẫu trong Golang

4.2. Giới thiệu Ví dụ

Trong ví dụ về Mẫu Phương thức Mẫu, có một lớp trừu tượng AbstractClass, bao gồm một phương thức mẫu TemplateMethod và một số phương thức trừu tượng AbstractMethod1 và AbstractMethod2. Các lớp cụ thể ConcreteClass1 và ConcreteClass2 kế thừa từ AbstractClass và triển khai các phương thức trừu tượng cụ thể.

4.3. Triển khai Bước 1: Định nghĩa lớp Mẫu Trừu tượng

Trước hết, chúng ta cần định nghĩa một lớp mẫu trừu tượng AbstractClass, trong đó có khai báo phương thức mẫu và các phương thức trừu tượng.

package main

import "fmt"

type AbstractClass interface {
	TemplateMethod()
	AbstractMethod1()
	AbstractMethod2()
	ConcreteMethod()
}

type BaseClass struct{}

func (b *BaseClass) TemplateMethod() {
	b.AbstractMethod1()
	b.AbstractMethod2()
	b.ConcreteMethod()
}

func (b *BaseClass) ConcreteMethod() {
	fmt.Println("Đang thực thi phương thức cụ thể")
}

4.4. Triển khai Bước 2: Triển khai Các lớp Mẫu Cụ thể

Tiếp theo, chúng ta cần tạo các lớp mẫu cụ thể, như ConcreteClass1 và ConcreteClass2, và triển khai các phương thức trừu tượng trong các lớp này.

type ConcreteClass1 struct {
	*BaseClass
}

func NewConcreteClass1() *ConcreteClass1 {
	return &ConcreteClass1{
		&BaseClass{},
	}
}

func (c *ConcreteClass1) AbstractMethod1() {
	fmt.Println("Đang thực thi phương thức 1 của ConcreteClass1")
}

func (c *ConcreteClass1) AbstractMethod2() {
	fmt.Println("Đang thực thi phương thức 2 của ConcreteClass1")
}

type ConcreteClass2 struct {
	*BaseClass
}

func NewConcreteClass2() *ConcreteClass2 {
	return &ConcreteClass2{
		&BaseClass{},
	}
}

func (c *ConcreteClass2) AbstractMethod1() {
	fmt.Println("Đang thực thi phương thức 1 của ConcreteClass2")
}

func (c *ConcreteClass2) AbstractMethod2() {
	fmt.Println("Đang thực thi phương thức 2 của ConcreteClass2")
}

4.5. Triển khai Bước 3: Định nghĩa Phương thức Trừu tượng và Cụ thể

Trong lớp mẫu trừu tượng, chúng ta cần định nghĩa một số phương thức trừu tượng và cụ thể. Các phương thức trừu tượng được triển khai bởi các lớp con cụ thể và các phương thức cụ thể được gọi trong phương thức mẫu.

4.6. Triển khai Bước 4: Khách hàng Sử dụng Phương thức Mẫu

Cuối cùng, chúng ta có thể sử dụng phương thức mẫu trong mã khách hàng để triển khai logic kinh doanh cụ thể.

func main() {
	class1 := NewConcreteClass1()
	class1.TemplateMethod()

	class2 := NewConcreteClass2()
	class2.TemplateMethod()
}

4.7. Bước Thực Hiện 5: Kết Quả Thực Hiện

Khi chúng ta chạy đoạn mã trên, chúng ta sẽ nhận được kết quả sau:

Thực thi phương thức 1 của ConcreteClass1
Thực thi phương thức 2 của ConcreteClass1
Thực thi phương thức cụ thể
Thực thi phương thức 1 của ConcreteClass2
Thực thi phương thức 2 của ConcreteClass2
Thực thi phương thức cụ thể

Trên đây là ví dụ về cách triển khai và sử dụng mẫu phương thức mẫu trong Golang. Bằng cách sử dụng mẫu phương thức mẫu, chúng ta có thể đóng gói một số hành vi chung vào một lớp trừu tượng và cho phép các lớp con cụ thể triển khai hành vi cụ thể của họ, từ đó cải thiện khả năng tái sử dụng mã và tính mở rộng.

Kết Luận

Hướng dẫn này giới thiệu mẫu phương thức mẫu trong Golang, bao gồm định nghĩa, đặc điểm và các trường hợp áp dụng của mẫu phương thức mẫu, và cung cấp một ví dụ triển khai. Thông qua ví dụ này, chúng ta có thể hiểu rõ cách triển khai cụ thể và cách sử dụng mẫu phương thức mẫu trong Golang.