1. Bridge Pattern là gì

1.1 Định nghĩa và Khái niệm

Bridge Pattern, cũng được biết đến là mẫu cầu, là một loại mẫu thiết kế cấu trúc giúp tách rời sự trừu tượng và sự thực thi, cho phép chúng thay đổi độc lập. Nói một cách đơn giản, Bridge Pattern là một giải pháp tách rời sự trừu tượng từ sự thực thi.

1.2 Mục đích và Hiệu quả của Bridge Pattern

Mục đích chính của Bridge Pattern là tách rời phần trừu tượng từ phần thực hiện để chúng có thể thay đổi và mở rộng một cách độc lập. Điều này được thực hiện thông qua việc thiết lập một lớp cầu trừu tượng kết nối với một lớp thực thi cụ thể.

2. Đặc điểm và Ưu điểm của Bridge Pattern

Một số đặc điểm và ưu điểm chính của Bridge Pattern bao gồm:

  • Tăng cường khả năng mở rộng hệ thống. Cả sự trừu tượng và sự thực thi có thể được mở rộng một cách độc lập mà không ảnh hưởng đến nhau.
  • Tuân thủ Nguyên lý Mở/Đóng. Phần trừu tượng và phần thực hiện có thể được mở rộng một cách độc lập mà không ảnh hưởng đến nhau.
  • Sự minh bạch về chi tiết thực hiện đối với người dùng, cho phép ẩn chi tiết thực hiện khỏi người dùng.

3. Các Tình huống Ứng dụng của Bridge Pattern

  • Khi bạn muốn tách rời việc thực hiện của một đối tượng phức tạp khỏi sự trừu tượng của nó, Bridge Pattern có thể được sử dụng. Điều này có thể có tác động tích cực đối với hiệu suất của mã hiện tại, đặc biệt khi chương trình chỉ sử dụng một phần của đối tượng vào thời gian chạy.
  • Khi bạn cần chia sẻ trạng thái thi hành cụ thể giữa nhiều đối tượng, nhưng đối với mã khách hàng, chúng cần phải xuất hiện như là các lớp độc lập.

4. Triển khai của Bridge Pattern trong Golang

4.1 Giới thiệu về Sơ đồ Lớp UML

Bridge Pattern trong Golang

4.2 Bước Cài đặt Chi tiết

4.2.1 Định nghĩa Giao diện Vai trò Trừu tượng

Đầu tiên, chúng ta định nghĩa một giao diện DrawAPI, mã cụ thể như sau:

// Giao diện vai trò trừu tượng
type DrawAPI interface {
	DrawACircle(radius, x, y int)
}

4.2.2 Thực hiện Lớp Vai trò Cụ thể

Tiếp theo, chúng ta định nghĩa hai lớp RedCircle và BlueCircle, thực hiện các phương thức trong giao diện DrawAPI:

// Lớp vai trò cụ thể
type RedCircle struct {}

func (c *RedCircle) DrawACircle(radius, x, y int) {
    // logic vẽ hình tròn màu đỏ
}

type BlueCircle struct {}

func (c *BlueCircle) DrawACircle(radius, x, y int) {
    // logic vẽ hình tròn màu xanh
}

4.2.3 Định nghĩa Giao diện Cầu Trừu tượng

Định nghĩa giao diện cầu Shape:

// Giao diện cầu trừu tượng
type Shape interface {
	Draw()
}

4.2.4 Triển khai Lớp Cầu Cụ thể

Triển khai lớp Circle, cài đặt giao diện Shape và chứa một đối tượng kiểu giao diện DrawAPI:

// Lớp Cầu cụ thể
type Circle struct {
    x, y, radius int
    drawAPI      DrawAPI
}

func (c *Circle) Draw() {
    c.drawAPI.DrawACircle(c.radius, c.x, c.y)
}

4.2.5 Ví dụ Gọi Mã khách hàng

func main() {
    redCircle := &Circle{100, 100, 10, new(RedCircle)}
    blueCircle := &Circle{100, 100, 10, new(BlueCircle)}

    redCircle.Draw()
    blueCircle.Draw()
}

Như vậy, chúng ta đã triển khai mẫu Bridge trong Golang.