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
Ở đâ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à Circle
và Square
để 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
package decoratorpattern; public abstract class Shape { public abstract void draw();
}
Bước 2
Tạo 2 class
hình học nguyên bản Circle
và Square
.
decoratorpattern/Circle.java
package decoratorpattern; public class Circle
extends Shape { @Override public void draw() { System.out.println("Shape: Circle"); }
}
decoratorpattern/Square.java
package decoratorpattern; public class Square
extends Shape { @Override public void draw() { System.out.println("Shape: Square"); }
}
Bước 3
Tạo abstract Decorator
.
decoratorpatter/Decorator.java
package decoratorpattern; public abstract class Decorator
extends Shape { protected Shape origin; public Decorator(Shape origin) { this.origin = origin; } @Override public void draw() { origin.draw(); }
}
Bước 4
Tạo class Bordered
mở rộng Decorator
.
decoratorpattern/Bordered.java
package decoratorpattern; public class Bordered
extends Decorator { public Bordered(Shape origin) { super(origin); } @Override public void draw() { origin.draw(); setBorder(); } private void setBorder() { System.out.println("Bordered color: Red"); }
}
Bước 5
Sử dụng các object Decorator
để vẽ hình.
PatternDemo.java
import decoratorpattern.Circle;
import decoratorpattern.Shape;
import decoratorpattern.Bordered;
import decoratorpattern.Square; public class PatternDemo { public static void main(String[] args) { Shape circle = new Circle(); System.out.println("=== Circle with normal border"); circle.draw(); Shape borderedCircle = new Bordered(new Circle()); System.out.println("=== Circle with red border"); borderedCircle.draw(); Shape borderedSquare = new Bordered(new Square()); 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
=== Circle with normal border
Shape: Circle
=== Circle with red border
Shape: Circle
Bordered color: Red
=== Square with red border
Shape: Square
Bordered color: Red