Behavioral patterns

Tiếp tục chuỗi bài về chủ đề design patterns, bài trước mình đã trình bày với các bạn về hai mẫu design của Creational patterns là Abstract Factory, Factory Method, hôm nay mình sẽ trình bay về một mẫu design hoàn toàn mới, đó là Behavioral patterns. Trong kỹ thuật phần mềm, behavioral design (mẫu thiết kế hành vi) là các mẫu thiết kế xác định và định nghĩa các mẫu giao tiếp chung giữa các đối tượng. Bằng cách làm như vậy, những mô hình này làm tăng tính linh hoạt trong việc thực hiện giao tiếp của các đối tượng. Mẫu thiết kế bao gồm:

  • Chain of responsibility : là phương án để chuyển yêu cầu giữa một chuỗi các đối tượng.
  • Iterator: truy cập liên tục các thành phần của bộ lựa chọn.
  • Null Object: được thiết kế để hoạt động như giá trị mặc định của đối tượng.
  • State: thay đổi hành vi của đối tượng khi trạng thái thay đổi.
  • Strategy: Đóng gói thuật toán bên trong một lớp.
  • Template method: Định nghĩa bộ khung gồm các bước chính xác của một thuật toán cho từng phân lớp.

1. Strategy

  • Mục đích:
    • Định nghĩa một tập các thuật toán, đóng gói từng cái một và làm cho nó chúng hoán đổi. Strategy làm cho thuật toán thay đổi độc lập với việc sử dụng thuật toán ở các máy khách.
    • Cho phép trừu tượng trong một giao diện, việc thực hiện chi tiết trong các lớp gốc.
  • Bài toán:
    • Một trong những chiến lược của thiết kế hướng đối tượng là "open-closed principle"
    • Việc đóng gói chi tiết giao diện trong một lớp cơ sở, và thực hiện chi tiết trong các lớp cha. Sau đó, các lớp con có thể kết hợp với một giao diện, và không ảnh hưởng bởi các biến động do sự thay đổi: không ảnh hưởng khi số lượng các lớp base thay đổi và không ảnh hưởng khi việc thực hiện một lớp bắt nguồn thay đổi.
    • Một giá trị chung của cộng đồng phần mềm trong nhiều năm: "tối đa hóa sự gắn kết và giảm thiểu sự phụ thuộc". Phương pháp tiếp cận thiết kế hướng đối tượng thể hiện trong hình là tất cả về giảm thiểu sự phụ thuộc. Từ khi mà phía khách chỉ được kết hợp với một khái niệm trừu tượng, và không phải là một hiện thực hóa của sự trừu tượng, phía khách có thể nói là thực hành "abstract coupling", một biến thể hướng đối tượng của lời kêu gọi chung "giảm thiểu sự phụ thuộc"
    • Một tính chất phổ biến hơn của nguyên lý "abstract couping" là "Program to an interface, not an implementation" ("từ chương trình tới một giao diện chứ không phải là quá trình thực hiện").
    • Phía khách cần thích ứng với "additional level of indirection" ("mức độ thay đổi cao nhất") mà giao diện cho phép. Giao diện nắm bắt được sự trừu tượng mà phía khách cần phải làm, và sự triển khai của giao diện đó đã được ẩn đi một cách hiệu quả.
  • Cấu trúc
    • Các thực thể giao diện có thể đại diện cho một trong hai lớp cơ sở trừu tượng, hoặc là phương pháp cú pháp của phía khách. Trong trường hợp trước, phân cấp thừa kế đại diện cho sự linh động trong đa hình. Trong trường hợp cuối, thì thực thể giao diện thể hiện mẫu code trong phía khách và phân cấp kế thừa đại diện cho đa hình tĩnh.
  • Ví dụ Strategy định nghĩa một tập các thuật toán có thể được sử dụng cho nhau. Các phương thức vận chuyển đến sân bay là một ví dụ về Strategy. Có một số lựa chọn như lái xe, đi taxi, xe buýt của thành phố hoặc các dịch vụ xe khác. Đối với một số sân bay, tàu điện ngầm và máy bay trực thăng cũng có sẵn như một phương tiện vận chuyển đến sân bay. Bất kỳ phương thức vận chuyển nào sẽ có một khách du lịch đến sân bay, và chúng ta có thể được sử dụng để hoán đổi cho nhau. Khách du lịch chọn chiến lược (lựa chọn) dựa trên sự cân bằng giữa chi phí, tiện lợi và thời gian để phù hợp với bản thân.

2. Template method

  • Mục đích:
    • Xác định bộ khung của một thuật toán trong một phép toán, một số bước sẽ được triển khai trong các phân lớp con. Template Method cho phép các lớp con định nghĩa lại các bước nhất định của thuật toán mà không thay đổi cấu trúc của thuật toán.
    • Lớp cơ sở khai báo thuật toán "placeholders", các lớp dẫn xuất thực hiện việc triển khai thuật toán placeholders.
  • Bài toán: Hai thành phần khác nhau nhưng có những điểm tương đồng đáng kể nhưng không chứng minh được việc sử dụng lại giao diện hoặc thực hiện chung. Nếu sự thay đổi chung cho cả hai thành phần trở nên cần thiết, cần phải tốn nhiều effort do trung lặp.
  • Hướng giải quyết
    • Thành phần thiết kế quyết định các bước của một thuật toán là bất biến (hoặc là 1 chuẩn), và đó là biến thể. Các bước được thực hiện trong một lớp cơ sở trừu tượng, trong khi các bước biến thể đưa ra một các bước cài đặt mặc định, hoặc không thực hiện bất kỳ điều gì cả. Từng bước đại diện cho "hooks", hoặc "placeholders", có thể hoặc phải được cung cấp bằng các thành phần của phía khách trong một lớp có nguồn gốc cụ thể.
    • Các thành phần thiết kế yêu cầu các bước cần thiết của một thuật toán, và thứ tự các bước, nhưng cho phép các thành phần phía khách được mở rộng hoặc thay thế một số bước này.
    • Template Method được sử dụng nổi bật trong các frameworks. Mỗi framework thực hiện các phần không thay đổi của kiến trúc của miênf và xác định "placeholders" cho tất cả tùy chọn hoặc tùy chỉnh cần thiết của khác hàng. Khi làm như vậy, framework này trở thành "center of the universe" ("trung tâm của vũ trụ"), và các tùy chỉnh phía khách đơn giản là "the third from the sun". Cơ cấu kiếm soát ngược này đã được gán nhãn "the Hollywood principle" - "don't call us, we'll call you".
  • Cấu trúc
    • Việc thực hiện template_method () là: gọi step_one(), gọi step_two(), và gọi step_three(). step_two() là phương thức cầu nối - là một placeholder. Nó được khai báo trong lớp cơ sở, và sau đó được định nghĩa trong các lớp dẫn xuất. Framework sử dụng rất nhiều Template Method rất nhiều. Tấ cả các mã tái sử dụng được định nghĩa trong các lớp cơ sở của framework, và sau đó phái khách của framework được tự do xác định các tùy chỉnh bằng cách tạo ra các lướp dẫn xuất nếu cần.
  • Ví dụ Template Method định nghĩa bộ khung của một thuật toán trong một hoạt động, và triển khai một số bước ở phân lớp. Nhà xây dựng sử dụng Template Method khi phát triển phân khu mới. Một phân khu điển hình bao gồm một số lượng hạn chế các sơ đồ tầng với các biến thể khác nhau có sắn cho từng tầng, Trong một kế hoạch với sàn nhà, nền móng, khung, ống nước và dây điện sẽ giống hệt nhau cho mỗi nhà. Sự khác biệt được giới thiệu trong các giai đoạn xây dựng sau để tạo ra nhiều mô hình khác nhau. Một ví dụ khác về Template Method: thói quen hàng ngày của một người công nhân:
    • Danh sách các thói quen của một người công nhân là giống nhau, nhưng mỗi phân lớp nhỏ hơn bao gồm lính cứu hỏa, người chuyển thư, giám đốc.... thì lại có thực hiện công việc là khác nhau. Và việc thực hiện này sẽ được phân tích và cài đặt trong từng phân lớp.

Trên đây, mình đã trình bày với các bạn về 2 mẫu thiết kế dựa trên hành vi đó là Strategy pattern (mẫu thiết kế chiến lược) và Template Method pattern (mẫu thiết kế phương pháp mẫu) cùng với ví dụ khá là dễ hiểu về chúng, mong rằng sẽ mang lại chút sự hứng thú và chút tò mò về các mẫu thiết kế còn lại để các bạn tiếp tục đi sâu với nó.