0

Design patterns (tiếp)

Bài viết được dịch từ các bài giới thiệu về Design Pattern của trang web Tutorial Point, và là phần tiếp theo của bài này.

Các loại Design Pattern

Bridge Pattern

Bridge pattern được sử dụng khi chúng ta muốn tách một abtraction từ implementation của nó để cả hai có thể thay đổi một cách độc lập với nhau. Đây là một pattern thuộc kiểu structural pattern, nó tách implementation class và abstract class bằng cách tạo ra một cầu nối giữa hai thứ.

Pattern này liên quan tới một interface có tác dụng như một cầu nối để làm cho các tính năng của concrete class độc lập với với class đã implement interface này. Cả hai class có thể được chỉnh sửa một cách hệ thống mà không ảnh hưởng tới tới cái còn lại.

Chúng ta sẽ thử làm theo Bridge pattern thông qua ví dụ sau đây, trong đó một hình tròn có thể được vẽ với nhiều mau khác nhau bằng cách sử dụng chung một abstract class nhưng implement các bridge class khác nhau.

Cách thực hiện

Chúng ta có interface DrawAPI có tác dụng như một implementer cầu nối và các concrete class RedCircle, GreenCircle implement interface DrawAPI. Shape là một abstract Class và sẽ sử dụng object của DrawAPI. Demo class BridgePatternDemo sẽ sử dụng class Shape để vẽ các vòng tròn có màu khác nhau.

bridge_pattern_uml_diagram.jpg

  1. Tạo một bridge implementer interface tên là DrawAPI
  2. Tạo các concrete bridge implementer class và implement interface DrawAPI.
  3. Tạo một abstract class Shape và sử dụng interface DrawAPI
  4. Tạo một concrete class và class này implement inteface Shape
  5. Tạo demo class sử dụng class ShapeDrawAPI để vẽ các vòng tròn có màu khác nhau.
  6. Kiểm tra kết quả.

Source code

Filter Pattern

Filter pattern hay Criteria pattern là một design pattern cho phép lập trình viên lọc một tập hợp các object sử dụng chuỗi các điều kiện khác nhau, tách biệt nhau, và thông qua các phép toán logic. Design pattern này thuộc kiểu structural pattern, pattern này kết hợp nhiều điều kiện để thu được một tiêu chuẩn duy nhất.

Cách thực hiện

Chúng ta sẽ tạo ra một object Person, interface Criteria và các concrete class implement interface này để lọc ra danh sách các object Person. Demo class CriteriaPatternDemo sử dụng các objects Criteria để lọc ra danh sách các Person object dựa trên nhiều các tiêu chuẩn khác nhau và sự kết hợp của giữa các tiêu chuẩn này.

filter_pattern_uml_diagram.jpg

  1. Tạo một class Person để sử dụng các criteria (tiêu chuẩn)
  2. Tạo một interface Criteria
  3. Tạo các concrete class implement interface Criteria ví dụ như CriteriaMale, CriteriaFemale, CriteriaSingle, AndCriteria, OrCriteria
  4. Sử dụng các Criteria khác nhau và kết hợp chúng lại để lọc ra các person.
  5. Kiểm tra kết quả.

SourceCode

Composite Pattern

Composite pattern được sử dụng khi chúng ta cần xử lý một nhóm các object theo các giống như đối với một object đơn lẻ. Composite pattern kết hợp các object theo một cấu trúc dạng cây để biểu diễn một phần cũng như toàn bộ các tầng. Đây là một structural pattern, pattern này tạo ra một cấu trúc dạng cây của nhó các object.

Pattern này tạo ra một class bao gồm một nhóm của các object của chính nó. Class này cũng cấp các phương thức để sửa đổi một nhóm các object giống nhau.

Chúng ta sẻ biểu diễn cách sử dụng của composite pattern thông qua ví dụ sau đây, hiển thị các cấp nhân viên của một tổ chức.

Cách thực hiện

Chúng ta có một class Employee, có tác dụng như một actor class của composite pattern. Demo class của chúng ta CompositePatternDemo sẽ sử dụng Employee class để thêm các cấp phòng ban và in ra tất cả các nhân viên.

composite_pattern_uml_diagram.jpg

  1. Tạo ra class Employee.java có một danh sách các object Employee
  2. Sử dụng class Employee để tạo và in ra các tầng employee.
  3. Kiểm tra kết quả.

SourceCode

Decorator Pattern

Decorator pattern cho phép người dùng có thể thêm các tính năng khác vào một object có sẵn mà không thay đổi cấu trúc của nó. Đây là một structural pattern và có hành xử như một phần gói bên ngoài một class có sẵn.

Pattern này tạo ra một decorator class, bao quanh class gốc và cung cấp các tính năng bổ sung giữ cho các methods khác của class không bị ảnh hưởng.

Chúng ta sẽ trình diễn cách sử dụng decorator pattern thông qua ví dụ sau đây, trong đó ta sẽ trang trí thêm vài màu sắc cho Shape mà không cần thiết phải sửa đổi class Shape.

Cách thực hiện

Chúng ta sẽ tạo ra một interface Shape và các concrete class implement interface Shape. Chúng ta sẽ tạo một abstract class decorator tên là ShapeDecorator, class này implement interface Shape và có instance variable là một Shape object.

RedShapeDecorator là concrete class implement ShapeDecorator

DecoratorPatternDemo, class demo của chúng ta sẽ sử dụng RedShapeDecorator để trang trí cho object Shape.

decorator_pattern_uml_diagram.jpg

  1. Tạo ra interface Shape với method draw.
  2. Tạo ra các concrete class như là Rectangle, Circle cùng implement interface này.
  3. Tạo ra abstract class decorator ShapeDecorator, class này implement interface Shape
  4. Tạo ra concrete decorator class extend class ShapeDecorator
  5. Sử dụng RedShapeDecorator để trang trí object Shape
  6. Kiểm tra output

SourceCode

Facade Pattern

Facade pattern ẩn đi sự phức tạp của hệ thống và cung cấp một interface để client có thể truy nhập vào hệ thống đó. Đây là một structural pattern.

Pattern này liên quan tới một class đơn, class này cung cấp các method đơn giản được yêu cầu bởi client và gọi tới các method của các class trong hệ thống đã có.

Cách thực hiện

Chúng ta sẽ tạo ra một interface tên là Shape và các concrete class implement interface Shape. Một class ShapeMaker sẽ được định nghĩa và class này sử dụng các concrete class để đại diện cho việc user gọi đến các class này. Demo class FacadePatternDemo sẽ sử dụng ShapeMaker class to show the results.

facade_pattern_uml_diagram.jpg

  1. Tạo ra interface Shape với method draw.
  2. Tạo ra các concrete class implement interface Shape, ví dụ như Rectangle, Square, Circle.
  3. Tạo một facade class có tên là ShapeMaker
  4. Trong demo class FacadePatternDemo, sử dụng facade class này để vẽ các kiểu shape khác nhau.
  5. Kiểm tra kết quả.

SourceCode

Flyweight Pattern

Flyweight pattern có mục đích chính là giảm thiểu số lượng objects được tạo ra cũng như hạn chế sử dụng memory để tăng performance. Đây là một structural pattern, pattern này cung cấp những phương pháp giúp bạn giảm số lượng object và cải thiện cấu trúc object của application.

Flyweight pattern sẽ tìm kiếm và tái sử dụng những object tương tự với object cần dùng bằng cách lưu chúng vào nơi nào đó và chỉ tạo ra object mới khi không tìm thấy object tương ứng nào khác. Chúng ta sẽ trình diễn cách sử dụng pattern này bằng việc vẽ ra 20 hình tròn ở các vị trí khác nhau nhưng ta chỉ tạo ra 5 object. Chỉ có 5 màu nên trường color sẽ được sử dụng để kiểm tra xem có Circle object tương tự nào có sẵn không.

Cách thực hiện

Chúng ta sẽ tạo ra một interface Shape và concrete class Circle, class này implement interface trên. Trong bước tiếp theo ta sẽ định nghĩa factory class ShapeFactory.

ShapeFactory có một HashMap của Circle sử dụng key là màu của object Circle. Mỗi khi có một request gửi yêu cầu tạo ra một Circle với một màu nào đó tới ShapeFactory, nó sẽ kiểm tra màu của circle object trên HashMap của nó, nếu object được tìm thấy nó sẽ trả về, ngược lại một một object mới sẽ được tạo ra và lưu trong hash map để sử dụng trong tương lai.

FlyWeightPatternDemo, demo class này sẽ sử dụng ShapeFactory để lấy về một object Shape. Nó sẽ gửi thông tin (đỏ / xanh lá cây / xanh dương / đen / trắng ) tới ShapeFactory để lấy về hình tròn có màu sắc nó cần.

flyweight_pattern_uml_diagram.jpg

  1. Tạo ra một interface Shape có phương thức draw
  2. Tạo ra concrete class Circle implement interface Shape
  3. Tạo ra một factory để có thể tự sinh object của concrete class dựa vào thông tin được truyền, sử dụng method getCircle.
  4. Sử dụng factory để lấy object của concrete class bằng cách gửi thông tin về màu sắc.
  5. Kiểm tra kết quả

SourceCode

(Vẫn còn tiếp)


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí