Composite Pattern la gi?
Composite Pattern la gi?

Học Design Pattern: Composite Pattern – Cây Tre 100 Đốt

Composite Pattern là một mẫu thiết kế thông minh, hướng dẫn chúng ta cách tổ chức dữ liệu một cách trực quan và dễ quản lý. Thay vì xử lý các đối tượng đơn lẻ, hãy gom nhóm những đối tượng có tính tương đồng lại với nhau, tạo thành một cấu trúc phân cấp linh hoạt. Điều này giúp chương trình hoặc module trở nên gọn gàng, dễ bảo trì và mở rộng hơn.

Đặt Vấn Đề – Sự Tích Cây Tre Trăm Đốt

Anh em ta ai cũng từng được nghe qua câu chuyện Cây Tre Trăm Đốt. Một anh chàng nông dân được ông Bụt ban cho câu thần chú giúp tạo ra Cây Tre Trăm Đốt để cưới được con gái Phú ông. Đâu ai biết được rằng 2000 năm sau, lại có một kỹ thuật lập trình nổi tiếng thế giới cũng dựa trên ý tưởng câu thần chú Khắc Nhập Khắc Nhập, Khắc Xuất Khắc Xuất ấy chính là Composite Pattern.

Mô Phỏng Khắc Nhập, Khắc Xuất Bằng Code

Hệ tư tưởng Composite Pattern khuyên chúng ta nên xây dựng cấu trúc quản lý các object theo một cấu trúc dữ liệu đặc thù: Có thể là Tree, List, hoặc Set, Map. Giống như việc sắp xếp các “Đốt Tre” trên “Cây Tre Trăm Đốt”. Trong cấu trúc này, có hai loại object chính:

  • Component (Đốt Tre): Là thể hiện của một đốt tre, không hơn không kém.
  • Composite (Cây Tre): Là thể hiện tập hợp của nhiều đốt tre, có thể sắp xếp theo thứ tự để tạo nên một Cây Tre Trăm Đốt.
interface Component {
    fun subCount(): Int
    fun addSub(comp: Component)
    fun removeSub(comp: Component)
    fun clear()
}

class BambooNode() : Component {
    override fun subCount(): Int {
        return 1
    }
    override fun addSub(comp: Component) = Unit
    override fun removeSub(comp: Component) = Unit
    override fun clear() = Unit
}

class BambooTree(private val name: String) : Component {
    private val bambooNodes = mutableListOf<Component>()

    override fun subCount(): Int {
        return bambooNodes.map{ it.subCount() }.sum()
    }

    override fun addSub(comp: Component) {
        bambooNodes.add(comp)
    }

    override fun removeSub(comp: Component) {
        bambooNodes.remove(comp)
    }
    override fun clear() {
      bambooNodes.clear()
    }
}

fun main() {
    val cayTreTramDot = BambooTree("Cay Tre Tram Dot")
    khacNhapKhacNhap(cayTreTramDot)
    println(cayTreTramDot)
    khacXuatKhacXuat(cayTreTramDot)
    println(cayTreTramDot)
}
fun khacNhapKhacNhap(bambooTree: BambooTree) {
  for(i in 0..100) {
    bambooTree.addSub(BambooNode())
  }
}
fun khacXuatKhacXuat(bambooTree: BambooTree) {
  bambooTree.clear()
}

Bài Học Rút Ra Từ Composite Pattern

Composite Pattern không chỉ là một kỹ thuật lập trình, mà còn là một tư duy linh hoạt yêu cầu chúng ta vận dụng sáng tạo những cấu trúc dữ liệu phức tạp nhất.

Quan trọng hơn, Composite Pattern còn là một phương pháp giúp chúng ta hệ thống hóa kiến thức và kinh nghiệm đã tích lũy.

Giống như việc xây dựng một Cây Tre Trăm Đốt với các Đốt Tre được sắp xếp khoa học, Composite Pattern giúp chúng ta tổ chức kiến thức và kinh nghiệm thành các Đốt nhỏ gọn, dễ hiểu, dễ truy xuất. Khi cần áp dụng, ta chỉ việc Khắc Nhập các Đốt này lại với nhau, tạo thành một Cây Tre Kiến Thức vững chắc, giúp chúng ta đưa ra quyết định nhanh chóng và hiệu quả trong thời đại công nghệ thay đổi chóng mặt này.

Hãy áp dụng Composite Pattern để không chỉ tạo những Cây Tre Trăm Đốt trong code của anh em thành những dự án vững chắc và dễ bảo trì, mà còn để xây dựng một hệ thống kiến thức và kinh nghiệm để sẵn sàng với mọi khó khăn!

@dantech chúc anh em thành công!