- vừa được xem lúc

[Design Patterns] Decorator Pattern

0 0 10

Người đăng: Thịnh Trần

Theo Viblo Asia

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

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 CircleSquare.

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

Bình luận

Bài viết tương tự

- vừa được xem lúc

Closure trong Javascript - Phần 2: Định nghĩa và cách dùng

Các bạn có thể đọc qua phần 1 ở đây. Để mọi người không quên, mình xin tóm tắt gọn lại khái niệm lexical environment:.

0 0 51

- vừa được xem lúc

Var vs let vs const? Các cách khai báo biến và hằng trong Javascript

Dạo này mình tập tành học Javascript, thấy có 2 cách khai báo biến khác nhau nên đã tìm tòi sự khác biệt. Nay xin đăng lên đây để mọi người đọc xong hy vọng phân biệt được giữa let và var, và sau đó là khai báo hằng bằng const.

0 0 31

- vừa được xem lúc

VueJS: Tính năng Mixins

Chào mọi người, hôm nay mình sẽ viết về Mixins và 1 số vấn đề trong sử dụng Mixins hay ho mà mình gặp trong dự án thực. Trích dẫn từ trang chủ của VueJS:.

0 0 27

- vừa được xem lúc

Asset Pipeline là cái chi chi?

Asset Pipeline. Asset pipeline là cái chi chi. . Giải thích:.

0 0 47

- vừa được xem lúc

Tạo data table web app lấy dữ liệu từ Google Sheets sử dụng Apps Script

Google Sheets là công cụ tuyệt vời để lưu trữ bảng tính trực tuyến, bạn có thể truy cập bảng tính bất kỳ lúc nào ở bất kỳ đâu và luôn sẵn sàng để chia sẻ với người khác. Bài này gồm 2 phần.

0 0 266

- vừa được xem lúc

Học Deep Learning trên Coursera miễn phí

Bạn muốn bắt đầu với Deep Learning nhưng không biết bắt đầu từ đâu? Bạn muốn có một công việc ở mức fresher về Deep Learning? Bạn muốn khoe bạn bè về kiến thức Deep Learning của mình. Bắt đầu từ đâu.

0 0 35