1. Mẫu Facade là gì

Mẫu Facade là một mẫu thiết kế cấu trúc cung cấp một giao diện thống nhất để truy cập vào một tập hợp các giao diện trong một phần hệ thống. Nó ẩn đi sự phức tạp của hệ thống con và cung cấp một giao diện đơn giản hóa cho bên ngoài.

2. Đặc điểm và Ưu điểm của Mẫu Facade

Mẫu Facade có những đặc điểm và ưu điểm sau:

  • Nó cung cấp một giao diện đơn giản hóa, từ đó làm cho hệ thống con dễ sử dụng hơn.
  • Nó giảm thiểu sự liên kết giữa client và hệ thống con. Client chỉ cần tương tác với lớp facade mà không cần phải hiểu rõ về các chi tiết cụ thể của việc triển khai hệ thống con.
  • Nó tuân theo Nguyên lý Mở/Đóng và cho phép sự tiện lợi trong việc thêm hoặc sửa đổi chức năng trong hệ thống con.

3. Ví dụ về Ứng dụng Thực tế của Mẫu Facade

Mẫu Facade có một loạt các ứng dụng thực tế trong phát triển, như:

  • Cung cấp một giao diện đơn giản để truy cập vào các thư viện hoặc API bên ngoài phức tạp.
  • Đóng gói một tập hợp các hoạt động logic phức tạp để đơn giản hóa quá trình gọi của client.
  • Cung cấp một giao diện đơn giản cho một hệ thống hiện tại để tích hợp với các hệ thống khác.

4. Triển khai của Mẫu Facade trong Golang

4.1. Sơ đồ lớp UML

Mẫu Facade trong Golang

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

Trong ví dụ này, hãy giả định rằng có một nền tảng thương mại điện tử bao gồm hệ thống quản lý đơn hàng, hệ thống quản lý hàng tồn kho, và hệ thống thanh toán. Hệ thống quản lý đơn hàng chịu trách nhiệm cho các chức năng như tạo đơn hàng và truy vấn đơn hàng, hệ thống quản lý hàng tồn kho chịu trách nhiệm cho việc truy vấn hàng tồn kho sản phẩm và giảm tồn kho, hệ thống thanh toán chịu trách nhiệm xử lý thanh toán đơn hàng. Để đơn giản hóa sự tương tác giữa client và các hệ thống con, chúng ta có thể sử dụng Mẫu Facade để thiết kế các giao diện của các hệ thống con này.

4.3. Bước Triển khai 1: Xác định Lớp Facade

type Facade struct {
    subsystemA *SubsystemA
    subsystemB *SubsystemB
    subsystemC *SubsystemC
}

func NewFacade() *Facade {
    return &Facade{
        subsystemA: NewSubsystemA(),
        subsystemB: NewSubsystemB(),
        subsystemC: NewSubsystemC(),
    }
}

func (f *Facade) Operation() {
    f.subsystemA.OperationA()
    f.subsystemB.OperationB()
    f.subsystemC.OperationC()
}

4.4. Bước Triển khai 2: Xác định Lớp Hệ Thống Con

type SubsystemA struct {}

func NewSubsystemA() *SubsystemA {
    return &SubsystemA{}
}

func (s *SubsystemA) OperationA() {
    // Logic cho hoạt động của Hệ Thống A
}

type SubsystemB struct {}

func NewSubsystemB() *SubsystemB {
    return &SubsystemB{}
}

func (s *SubsystemB) OperationB() {
    // Logic cho hoạt động của Hệ Thống B
}

type SubsystemC struct {}

func NewSubsystemC() *SubsystemC {
    return &SubsystemC{}
}

func (s *SubsystemC) OperationC() {
    // Logic cho hoạt động của Hệ Thống C
}

4.5. Bước Triển khai 3: Thực hiện Mã Người Dùng Bằng Mẫu Facade

func main() {
    facade := NewFacade()
    facade.Operation()
}