[Design Patterns] Decorator Pattern

Decorator cho phép chúng ta bổ sung thêm chức năng mới vào một object đã tồn tại trước đó mà không cần thực hiện chỉnh sửa can thiệp vào kiến trúc của object đó. Decorator được xếp vào nhóm các pattern Kiến Trúc. Decorator tạo ra một class vỏ bọc bao quanh class nguyên bản

Decorator cho phép chúng ta bổ sung thêm chức năng mới vào một object đã tồn tại trước đó
mà không cần thực hiện chỉnh sửa can thiệp vào kiến trúc của object đó. Decorator được xếp
vào nhóm các pattern Kiến Trúc.

Decorator tạo ra một class vỏ bọc bao quanh class nguyên bản và cung cấp thêm các
chức năng mở rộng, đồng thời duy trì tính đặc trưng chặt chẽ của các phương thức đã có.

Áp dụng triển khai

sơ đồ các class

Ở đây chúng ta có một phần mềm vẽ các hình phẳng 2D với các class cơ bản là CircleSquare
để vẽ các hình tròn và hình vuông. Bây giờ nhu cầu phát sinh là chúng ta muốn vẽ thêm đường viền
cho các hình này, nhưng lại không muốn chỉnh sửa 2 class ban đầu.

Do đó chúng ta sẽ tạo ra một abstract Decorator bao quanh các object hình học nguyên bản.
Sau đó class Bordered sẽ triển khai Decorator và thêm vào khả năng vẽ đường viền.

Cuối cùng là code main trong PatternDemo sẽ sử dụng các object Decorator để vẽ hình.

Bước 1

Tạo abstract Shape.

decoratorpatter/Shape.java

packagedecoratorpattern;publicabstractclassShape{publicabstractvoiddraw();}

Bước 2

Tạo 2 class hình học nguyên bản CircleSquare.

decoratorpattern/Circle.java

packagedecoratorpattern;publicclassCircleextendsShape{@Overridepublicvoiddraw(){System.out.println("Shape: Circle");}}

decoratorpattern/Square.java

packagedecoratorpattern;publicclassSquareextendsShape{@Overridepublicvoiddraw(){System.out.println("Shape: Square");}}

Bước 3

Tạo abstract Decorator.

decoratorpatter/Decorator.java

packagedecoratorpattern;publicabstractclassDecoratorextendsShape{protectedShape origin;publicDecorator(Shape origin){this.origin = origin;}@Overridepublicvoiddraw(){
      origin.draw();}}

Bước 4

Tạo class Bordered mở rộng Decorator.

decoratorpattern/Bordered.java

packagedecoratorpattern;publicclassBorderedextendsDecorator{publicBordered(Shape origin){super(origin);}@Overridepublicvoiddraw(){
      origin.draw();setBorder();}privatevoidsetBorder(){System.out.println("Bordered color: Red");}}

Bước 5

Sử dụng các object Decorator để vẽ hình.

PatternDemo.java

importdecoratorpattern.Circle;importdecoratorpattern.Shape;importdecoratorpattern.Bordered;importdecoratorpattern.Square;publicclassPatternDemo{publicstaticvoidmain(String[] args){Shape circle =newCircle();System.out.println("=== Circle with normal border");
      circle.draw();Shape borderedCircle =newBordered(newCircle());System.out.println("=== Circle with red border");
      borderedCircle.draw();Shape borderedSquare =newBordered(newSquare());System.out.println("=== Square with red border");
      borderedSquare.draw();}}

Bước 6

Kiểm chứng lại kết quả được in ra ở console.

console

===Circlewithnormal border
Shape:Circle===Circlewithred border
Shape:CircleBordered color:Red===Squarewithred border
Shape:SquareBordered color:Red

Nguồn: viblo.asia

Bài viết liên quan

Tấn Công Ứng Dụng Web: Mối Đe Dọa Hàng Đầu – Phần 2

viết lại nội dung này ” Phát hiện các cuộc tấn công Cross Site Scripting (XSS)

AI Chatbot 2025: Xu Hướng Tất Yếu Cho Doanh Nghiệp Dẫn Đầu

Giới thiệu AI chatbots đã trải qua một hành trình đáng kể, từ những công cụ t

Tấn Công Ứng Dụng Web: Mối Đe Dọa Hàng Đầu – Phần 1

Tấn công web là gì? Ứng dụng web là các ứng dụng cung cấp dịch vụ cho người

SEO Mũ Trắng, Mũ Đen, Mũ Xám: Hiểu Biết và Lựa Chọn Phù Hợp

SEO Mũ Trắng, Mũ Đen, Mũ Xám: Hiểu Biết và Lựa Chọn Phù Hợp Trong kỷ nguyên s