Bạn đang bối rối hai điều rất khác nhau. GoF phân loại Builder như là một mô hình sáng tạo, trong khi Decorator là một mô hình kết cấu. Chúng được mô tả như sau (Gamma et al, trang 1):
Builder (97) Tách việc xây dựng một đối tượng phức tạp từ đại diện của mình để quá trình thi công tương tự có thể tạo ra cơ quan đại diện khác nhau.
Trang trí (175) Đính kèm thêm trách nhiệm cho đối tượng một cách linh hoạt. Trang trí cung cấp giải pháp thay thế linh hoạt cho phân lớp để mở rộng chức năng.
Lưu ý sự nhấn mạnh trên trang trí. Đó là một sự thay thế linh hoạt cho phân lớp phụ. Phân lớp được sử dụng để mô hình hóa mối quan hệ là mối quan hệ. Pho mát không phải là pizza. Các bánh pizza là sáng tác của một số thành phần, và thường được mô hình hóa bằng cách sử dụng chế phẩm.
Mẫu trình xây dựng có liên quan ở đây vì có rất nhiều thành phần cần thiết để xây dựng chúng theo cách được chuẩn hóa.
Để lấy một ví dụ thực tế về trang trí, gần đây tôi muốn ghi lại các truy vấn được thực hiện bằng cách sử dụng jdbc trong ứng dụng java của tôi. Tôi thực hiện điều này bằng cách thực hiện một lớp gọi là LoggingConnection, mở rộng giao diện Connection.
public class LoggingConnection implements Connection
{
public static class LogEntry
{
public String sql;
public int invocationCount;
public double avgTime;
public double maxTime;
}
private Connection delegate;
private Map<String, LogEntry> log;
public LoggingConnection(Connection delegate)
{
this.delegate = delegate;
this.log = new HashMap<String, LogEntry>();
}
public Map<String, LogEntry> getLog()
{
return log;
}
@Override
public void clearWarnings()
throws SQLException
{
delegate.clearWarnings();
}
@Override
public void close()
throws SQLException
{
delegate.close();
}
// forwarding declarations to all other methods declared in the interface
...
}
Điều này cho phép tôi thực hiện kết nối cụ thể và mở rộng chức năng của nó khi chạy. Phân lớp phụ sẽ có vấn đề trong ngữ cảnh này, bởi vì bạn không nhất thiết phải biết đối tượng kết nối nào thực sự được trả về. Điều này là do nó được xây dựng cho bạn sử dụng nhà máy DriverManager:
Connection conn = DriverManger.getConnection(dsn);
Đối tượng conn trong trường hợp này là một thực hiện chứa trong trình điều khiển mà tôi không biết tên. Cách tiếp cận trang trí của beuty là tôi không cần phải biết, và nó không liên quan đến việc thực hiện cụ thể.
tôi đã có suy nghĩ tương tự khi tôi học được điều này với ví dụ. Giáo sư không thể giúp tôi, nhưng điều này không, cảm ơn! – Mene