Decorator Pattern là một design pattern thuộc nhóm cấu trúc (structural pattern) trong lập trình hướng đối tượng. Pattern này cho phép chúng ta mở rộng chức năng của một đối tượng mà không làm thay đổi cấu trúc của nó. Decorator Pattern giúp chúng ta áp dụng tính chất "mở rộng bằng cách kế thừa" một cách linh hoạt hơn bằng cách sử dụng các lớp decorator để bọc các đối tượng cơ bản và thêm các tính năng bổ sung khi cần thiết.

1. Giới thiệu:

Decorator Pattern là một design pattern thuộc nhóm cấu trúc (structural pattern) trong lập trình hướng đối tượng. Pattern này cho phép chúng ta mở rộng chức năng của một đối tượng mà không làm thay đổi cấu trúc của nó. Decorator Pattern giúp chúng ta áp dụng tính chất "mở rộng bằng cách kế thừa" một cách linh hoạt hơn bằng cách sử dụng các lớp decorator để bọc các đối tượng cơ bản và thêm các tính năng bổ sung khi cần thiết.

 

2. Chức năng:

Mô hình Decorator (Decorator pattern) cho phép người dùng thêm chức năng mới vào một đối tượng hiện có mà không làm thay đổi cấu trúc của nó. Mô hình thiết kế này thuộc nhóm cấu trúc (structural pattern) vì nó hoạt động như một bọc (wrapper) cho các lớp đã tồn tại.

Mô hình này tạo ra một lớp decorator (lớp trang trí) bọc lấy lớp gốc và cung cấp các chức năng bổ sung mà vẫn giữ nguyên chữ ký các phương thức của lớp.

Chúng ta sẽ thể hiện việc sử dụng mô hình decorator qua ví dụ sau: chúng ta sẽ trang trí một hình học bằng một số màu sắc mà không làm thay đổi lớp hình học ban đầu.

 

3. Minh họa bằng code Java:

Giả sử chúng ta đang xây dựng một ứng dụng đồ họa và có một interface Shape đại diện cho các hình học. Chúng ta muốn thêm tính năng vẽ viền cho các hình học này bằng cách sử dụng Decorator Pattern.

Bước 1: Tạo interface Shape và các lớp implementation RectangleCircle

// Shape.java
public interface Shape {
    void draw();
}

// Rectangle.java
public class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("Vẽ hình chữ nhật");
    }
}

// Circle.java
public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("Vẽ hình tròn");
    }
}

 

Bước 2: Tạo lớp decorator ShapeDecorator:

// ShapeDecorator.java
public abstract class ShapeDecorator implements Shape {
    protected Shape decoratedShape;

    public ShapeDecorator(Shape decoratedShape) {
        this.decoratedShape = decoratedShape;
    }

    @Override
    public void draw() {
        decoratedShape.draw();
    }
}

 

Bước 3: Tạo các lớp decorator cụ thể như BorderDecorator:

// BorderDecorator.java
public class BorderDecorator extends ShapeDecorator {
    public BorderDecorator(Shape decoratedShape) {
        super(decoratedShape);
    }

    @Override
    public void draw() {
        decoratedShape.draw();
        addBorder();
    }

    private void addBorder() {
        System.out.println("Vẽ viền cho hình học");
    }
}

 

Bước 4: Sử dụng Decorator Pattern để thêm tính năng viền cho các hình họ:

public class Main {
    public static void main(String[] args) {
        // Tạo hình chữ nhật và vẽ viền
        Shape rectangle = new Rectangle();
        Shape borderedRectangle = new BorderDecorator(rectangle);
        borderedRectangle.draw();

        // Tạo hình tròn và vẽ viền
        Shape circle = new Circle();
        Shape borderedCircle = new BorderDecorator(circle);
        borderedCircle.draw();
    }
}

 

Kết quả:

Vẽ hình chữ nhật
Vẽ viền cho hình học
Vẽ hình tròn
Vẽ viền cho hình học

 

minhnhatict@gmail.com Design Pattern