Bước tới nội dung

Decorator pattern

Bách khoa toàn thư mở Wikipedia

Đây là một phiên bản cũ của trang này, do Tiennm (thảo luận | đóng góp) sửa đổi vào lúc 21:06, ngày 25 tháng 5 năm 2006. Địa chỉ URL hiện tại là một liên kết vĩnh viễn đến phiên bản này của trang, có thể khác biệt rất nhiều so với phiên bản hiện hành.

Trong lập trình hướng đối tượng, decorator pattern (mẫu trang trí) là một mẫu thiết kế cho phép thêm các thao tác mới vào một thao tác có sẵn một cách linh động.

Giới thiệu

Mẫu trang trí làm việc bằng cách đóng gói đối tượng gốc vào trong một đối tượng "trang trí" mới, thường đạt được bằng cách truyền đối tượng gốc như một tham số tới hàm khởi tạo của decorator, decorator sẽ thực thi các chức năng mới. Giao diện của đối tượng gốc cần được duy trì qua decorator.

Động cơ

Cấu trúc

Tập tin:Decorator.jpg

Example

Java

Ví dụ sau sử dụng kịch bản window/scrolling

// the Window interface
interface Window {
    public void draw(); // draws the Window
    public String getDescription(); // returns a description of the Window
}


// implementation of a simple Window without any scrollbars
class SimpleWindow implements Window {
    public void draw() {
        // draw window
    }

    public String getDescription() {
        return "simple window";
    }
}

Các lớp sau chứa các trang trí cho tất cả các lớp Window, bao gồm cả trang trí của chính các lớp đó.

// abstract decorator class - note that it implements Window
abstract class WindowDecorator implements Window {
    protected Window decoratedWindow; // the Window being decorated

    public WindowDecorator(Window decoratedWindow) {
        this.decoratedWindow = decoratedWindow;
    }
}


// the first concrete decorator which adds vertical scrollbar functionaliy
class VerticalScrollBarDecorator extends WindowDecorator {
    public VerticalScrollBarDecorator (Window decoratedWindow) {
        super(decoratedWindow);
    }
 
    public void draw() {
        drawVerticalScrollBar();
        decoratedWindow.draw();
    }

    private void drawVerticalScrollBar() {
        // draw the vertical scrollbar
    }

    public String getDescription() {
        return decoratedWindow.getDescription() + ", including vertical scrollbars";
    }
}


// the second concrete decorator which adds horizontal scrollbar functionaliy
class HorizontalScrollBarDecorator extends WindowDecorator {
    public HorizontalScrollBarDecorator (Window decoratedWindow) {
        super(decoratedWindow);
    }

    public void draw() {
        drawHorizontalScrollBar();
        decoratedWindow.draw();
    }

    private void drawHorizontalScrollBar() {
        // draw the horizontal scrollbar
    }

    public String getDescription() {
        return decoratedWindow.getDescription() + ", including horizontal scrollbars";
    }
}

Đây là chương trình test, nó tạo một mẫu Window sẽ được trang trí đầy đủ (chẳng hạn với các thanh trượt dọc và ngang) và in ra mô tả của nó:

public class DecoratedWindowTest {
    public static void main(String[] args) {
        // create a decorated Window with horizonal and vertical scrollbars
        Window decoratedWindow = new HorizontalScrollBarDecorator(
                new VerticalScrollBarDecorator(new SimpleWindow()));

        // print the Window's description
        System.out.println(decoratedWindow.getDescription());
    }
}

Kết quả in ra của chương trình là ""simple window, including vertical scrollbars, including horizontal scrollbars". Chú ý cách mà hàm getDescription method của hai trang trí trước tiên lấy mô tả của Window đã được trang trí và "trang trí" nó với một hậu tố.