# Decorator pattern

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

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.

## [sửa] 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.

## [sửa] Động cơ

Lấy một ví dụ về cửa sổ. Để cho phép trượt trên nột dung của cửa sổ, chúng ta có thể thêm các thanh trượt ngang và thanh trượt dọc. Giả sử các cửa sổ biểu diễn bằng một thể hiện của lớp Window, và giả sử rằng lớp này không có chức năng thêm một thanh trượt. Chúng ta có thể tạo một lớp con ScrollingWindow cung cấp các chức năng đó, hoặc chúng ta có thể tạo một lớp ScrollingWindowDecorator đơn thuần thêm chức năng này vào lớp Window có sẵn, nhưng điều này không phải luôn luôn khả thi—chúng ta có thể không thể truy cập và thực thi của nó, hoặc có thể thêm bộ nhớ cho các chức năng mới mà phần lớn các đối tượng sẽ không dùng đến.

Bây giờ lại giả sử chúng ta cũng muốn thêm các biên cho các cửa sổ của chúng ta. Một lần nữa, lớp Window gốc không hỗ trợ. Lớp con ScrollingWindow cũng có vấn đề, vì nó đã tạo một kiểu cửa sổ mới. Nếu chúng ta muốn thêm biên vào tất cả của sổ, chúng ta phải tạo các lớp con WindowWithBorder và ScrollingWindowWithBorder. Rõ ràng, vấn đề sẽ ngày càng trở lên tồi tệ khi thêm các chức năng mới. Chúng ta chỉ cần tạo một lớp mới BorderedWindowDecorator—trong thời gian chạy, chúng ta có thể trang trí cửa sổ có sẵn với ScrollingWindowDecorator hoặc BorderedWindowDecorator hoặc cả hai, nếu thích hợp.

## [sửa] Cấu trúc

## [sửa] Example

### [sửa] 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ố.

Lấy từ “http://vi.wikipedia.org../../../d/e/c/Decorator_pattern.html”

Thể loại: Các mẫu thiết kế phần mềm

##### Views

- Bài viết
- Thảo luận
- Phiên bản hiện hành

##### Tìm kiếm

##### Ngôn ngữ khác

- Deutsch
- English
- Español
- Français
- Italiano
- Nederlands
- 日本語
- Polski
- Русский