Đối tượng có giá trị tiềm ẩn: danh tính của chúng (có thể được kiểm tra bằng cách áp dụng ==
). Khi bạn quấn chúng, bạn có thể ẩn danh tính đó một cách hiệu quả (tệ hơn, bạn cũng phơi bày một bản sắc có khả năng gây hiểu lầm, danh tính của trình bao bọc). Vì vậy, một cách tiếp cận rõ ràng là bù đắp cho điều này bằng cách phơi bày danh tính của đối tượng thông qua một cách khác - một cách rõ ràng. Ví dụ. bạn có thể giới thiệu một phương thức Object getIdentity()
, trả về một đối tượng thực sự đại diện cho danh tính dự định và cho phép áp dụng ==
cho nó.
Nhược điểm lớn nhất là bạn vẫn cho phép ==
trên chính trang trí, ví dụ: một mối nguy hiểm rằng:
- là đủ tự nhiên để bị lừa vào nó (
identity == decorator
thay vì identity == decorator.getIdentity()
)
- âm thầm làm điều sai (so sánh với một ngoại lệ thời gian chạy - may mắn gỡ lỗi tốt mà)
Vấn đề sẽ không tồn tại nếu, ví dụ, các đối tượng có một phương pháp như:
protected Object getIdentity() {
return this;
}
Trên đó ==
nhà điều hành wo uld được xác định, do đó, một wrapper cũng có thể quấn danh tính của đối tượng được bao bọc, thay vì thay thế nó bằng chính nó.
Nguồn
2010-10-13 00:00:10
Có một số cách để diễn giải những gì bạn đã mô tả trong phân cấp lớp. _djechelon_ cung cấp một câu trả lời cho một giải thích câu hỏi của bạn ... Tôi có một giải thích trong tâm trí để bạn có thể muốn cung cấp cho chúng tôi với một số đoạn mã. – Isaac