Professional Documents
Culture Documents
Mau Thiet Ke Phan Mem Pham Cuoi Ki
Mau Thiet Ke Phan Mem Pham Cuoi Ki
Tên đề tài: Tìm hiểu Spring Framework và các mẫu thiết kế phần mềm có
trong spring framework
......................................................................................................................................
......................................................................................................................................
......................................................................................................................................
......................................................................................................................................
......................................................................................................................................
2
Tp. Hồ Chí Minh, ngày …., tháng …., năm 2022
LỜI CẢM ƠN 6
2. Overview of GOF Design Patterns - Core Design Patterns 7
Giới thiệu về sức mạnh của các mẫu Design Patterns 7
Tổng quan về mô hình thiết kế GOF 7
Creational design patterns 9
3. Consideration of Structural and Behavioral Patterns 18
Phân tích cốt lõi của mẫu thiết kế 18
Mẫu cấu trúc 18
Mẫu hành vi 27
Mẫu thiết kế J2EE 32
4. Wiring Beans using the Dependency Injection Pattern. 34
The dependency injection pattern 34
Types of dependency injection patterns 34
Constructor-based dependency injection 34
Setter-based dependency injection 35
Configuring the dependency injection pattern with Spring 36
Annotating beans for autowiring Lookup-method injection pattern 36
Implementing the Abstract Factory Pattern in Spring 37
Implementation of FactoryBean interface in Spring 37
5. Ví dụ 22 mẫu đã học và 7 mẫu bổ sung 38
3
Structural Pattern: 38
1. Mẫu Adapter: 38
2. Bridge: 39
3. Mẫu Composite: 40
4. Mẫu Decorator: 40
5. Mẫu Facade: 41
6. Mẫu Flyweight: 42
7. Mẫu Proxy: 42
Creational Pattern: 43
8. Mẫu Factory Method: 43
9. Abstract Factory: 44
10. Builder: 44
11. Singleton: 45
12. Prototype: 45
Behavior Pattern: 46
13. Chain of Responsibility: 46
14. Command: 47
15. Iterator: 48
16. Mediator: 49
17. Memento: 50
18. Observer: 51
19. Strategy: 51
20. Template Method: 52
21. Visitor: 53
4
22. State: 54
Các mẫu mở rộng: 55
23. Null object: 55
24. Interpreter Pattern: 56
25. MVC Pattern: 58
26. Dependency Injection Pattern: 59
27. Dao Pattern: 60
28. Intercepting Filter 61
29. DataAccessObjectPattern 63
Tài Liệu Tham Khảo 63
5
LỜI CẢM ƠN
Chúng em xin gửi lời cảm ơn chân thành đến Khoa Đào tạo Chất lượng cao, Trường
Đại học Sư phạm Kỹ thuật TP.HCM đã tạo điều kiện thuận lợi cho chúng em học tập và
hoàn thành đề tài báo cáo này. Đặc biệt, chúng em xin bày tỏ lòng biết ơn sâu sắc đến
thầy Nguyễn Minh Đạo đã truyền đạt kiến thức và hướng dẫn chúng em trong quá trình
hoàn thành báo cáo.
Nhóm em đã cố gắng vận dụng những kiến thức đã học được trong học kỳ qua để
hoàn thành bài báo cáo. Nhưng do kiến thức hạn chế và không có nhiều kinh nghiệm thực
tiễn nên khó tránh khỏi những thiếu sót trong quá trình nghiên cứu và trình bày. Rất kính
mong sự góp ý của thầy để bài báo cáo của nhóm em được hoàn thiện hơn.
Một lần nữa, nhóm em xin trân trọng cảm ơn sự quan tâm giúp đỡ của thầy đã giúp
đỡ nhóm em trong quá trình thực hiện bài báo cáo này.
Xin trân trọng cảm ơn!
6
2. Overview of GOF Design Patterns - Core
Design Patterns
1. Giới thiệu về sức mạnh của các mẫu Design Patterns
Trên thực tế, cụm từ Design Pattern không liên quan đến bất kỳ ngôn
ngữ lập trình nào và nó cũng không cung cấp các giải pháp cụ thể cho các
vấn đề về ngôn ngữ, là một khái niệm kỹ thuật phần mềm mô tả các giải
pháp định kỳ cho các vấn đề phổ biến trong thiết kế phần mềm. Các mẫu
này cũng đại diện cho các thực tiễn tốt nhất được sử dụng bởi các nhà phát
triển phần mềm có kinh nghiệm.
Tác giả của cuốn sách có tiêu đề là GOF này là nhóm 4 người gồm
có Erich Gamma, Richard Helm, Ralph Johnson và John Vlissides. Vấn đề
trong cuốn sách liên quan đến các yếu tố của phần mềm hướng đối tượng
7
có thể tái sử dụng, đã khởi xướng khái niệm về các mẫu thiết kế trong phát
triển phần mềm.
Các mẫu Gang of Four (GoF) gồm 23 mẫu thiết kế phần mềm cổ
điển cung cấp các giải pháp cho các vấn đề phổ biến trong thiết kế phần
mềm. Các mẫu này được phân loại thành hai loại chính:
Core Design Patterns được chia thành ba loại chính của mẫu thiết kế,
như sau:
+ Creational Design Pattern: các mẫu trong danh mục này cung cấp
một cách để xây dựng các đối tượng khi các nhà thầu sẽ không phục vụ
mục đích của bạn. Logic sáng tạo của các đối tượng được ẩn. Các chương
trình dựa trên các mẫu này linh hoạt hơn trong việc quyết định tạo đối
tượng theo yêu cầu của bạn và các trường hợp sử dụng của bạn cho ứng
dụng.
+ Structural Design Pattern: các mẫu trong danh mục này liên quan
đến thành phần của các lớp hoặc đối tượng. Trong ứng dụng doanh nghiệp,
có hai kỹ thuật thường được sử dụng để tái sử dụng chức năng trong các hệ
thống hướng đối tượng: một là kế thừa lớp và hai là khái niệm thành phần
đối tượng của thừa kế. hái niệm thành phần đối tượng của kế thừa được sử
dụng để soạn thảo giao diện và xác định các cách để soạn thảo các đối
tượng để có được các chức năng mới.
+ Behavioral Design Pattern: các mẫu trong danh mục này, đặc
trưng cho các cách mà các lớp hoặc đối tượng tương tác và phân phối trách
8
nhiệm. Các mẫu thiết kế này đặc biệt quan tâm đến giao tiếp giữa các đối
tượng. Mô hình thiết kế hành vi được sử dụng để kiểm soát và giảm luồng
ứng dụng phức tạp trong ứng dụng doanh nghiệp.
Hơn nữa, JEE Design patterns, là loại chính khác của các mẫu thiết
kế. Thiết kế ứng dụng có thể được đơn giản hóa vô cùng bằng cách áp
dụng các mẫu thiết kế Java EE. Các mẫu thiết kế của Java EE đã được ghi
lại trong các bản thiết kế Java của Sun.
Các mẫu thiết kế Java EE này cung cấp các hướng dẫn giải pháp
được thử nghiệm theo thời gian và các thực tiễn tốt nhất để tương tác đối
tượng trong các lớp khác nhau của ứng dụng Java EE. Các mẫu thiết kế
này đặc biệt quan tâm đến các lớp được liệt kê sau:
Các mẫu thiết kế sáng tạo( Creational design patterns ) được liên kết
với phương pháp tạo đối tượng. Logic tạo của đối tượng được ẩn cho người
gọi của đối tượng này.
Cách này không phù hợp với một số trường hợp, bởi vì nó là một
cách tạo mã cứng để tạo ra một đối tượng. Nó cũng không phải là một thực
tiễn tốt nhất để tạo ra một đối tượng bởi vì đối tượng có thể được thay đổi
theo bản chất của chương trình.
9
Do đó, mô hình thiết kế sáng tạo( Creational design patterns ) cung
cấp sự linh hoạt để tạo ra một đối tượng theo bản chất của chương trình.
Xác định một giao diện để tạo một đối tượng, nhưng hãy để các lớp
con quyết định lớp nào sẽ khởi tạo. Phương pháp này cho phép một lớp trì
hoãn việc khởi tạo cho các lớp con.
Theo mẫu thiết kế nhà máy(Factory) này, ta nhận được một đối
tượng của một lớp mà không phơi bày logic cơ bản cho máy khách(client).
Nó gán một đối tượng mới cho người gọi bằng cách sử dụng một giao diện
chung hoặc lớp trừu tượng. Điều này có nghĩa là mô hình thiết kế che giấu
logic thực tế của việc thực hiện một đối tượng, cách tạo nó và lớp nào khởi
tạo nó. Chịu trách nhiệm cho các nhiệm vụ này. Mô hình nhà máy(Factory)
là một trong những mẫu thiết kế được sử dụng nhiều nhất trong Java.
Mẫu nhà máy thúc đẩy khớp nối lỏng lẻo giữa các thành phần hoặc
lớp hợp tác bằng cách sử dụng các giao diện thay vì ràng buộc các lớp
dành riêng cho ứng dụng vào mã ứng dụng bằng cách sử dụng mẫu này.
Ta có thể thực hiện một đối tượng của các lớp thực hiện giao diện,
khi chạy vòng đời đối tượng được quản lý bởi nhà máy được thực hiện bởi
mô hình này.
+ Mẫu này loại bỏ gánh nặng cho nhà phát triển để tạo và quản lý
các đối tượng.
10
+ Mẫu này loại bỏ sự kết hợp chặt chẽ giữa các thành phần cộng tác
vì một thành phần không biết các lớp con nào sẽ được yêu cầu để tạo.
+ Tránh mã cứng để tạo một đối tượng của lớp.
Spring container hoạt động dựa trên mô hình nhà máy để tạo ra các
beans cho ứng dụng Spring và cũng như quản lý vòng đời của mỗi beans.
Cung cấp một giao diện để tạo các mối liên hệ giữa các đối tượng
liên quan hoặc phụ thuộc mà không cần chỉ định các lớp cụ thể của nó.
Đây là một mô hình thiết kế cao cấp so với mô hình thiết kế phương
pháp nhà máy. Theo mẫu thiết kế này, bạn chỉ cần xác định một giao diện
hoặc lớp trừu tượng để tạo một đối tượng phụ thuộc có liên quan mà không
cần chỉ định lớp con cụ thể của nó.
Trong mô hình nhà máy trừu tượng, một giao diện chịu trách nhiệm
tạo ra một nhà máy gồm các đối tượng liên quan mà không chỉ định rõ ràng
các lớp của chúng. Mỗi nhà máy được tạo ra có thể cung cấp cho các đối
tượng theo mẫu nhà máy.
11
Những lợi ích của mô hình nhà máy trừu tượng(Abstract
factory)
+ Cung cấp khớp nối lỏng lẻo giữa các thành phần liên quan. Nó
cũng cách ly mã máy khách(client) với các lớp cụ thể.
+ Mô hình thiết kế này là một thiết kế cấp cao hơn mô hình nhà máy.
+ Mẫu này cung cấp tính nhất quán tốt hơn trong thời gian xây dựng
của các đối tượng trên toàn ứng dụng.
+ Mô hình này dễ dàng hoán đổi các thành phần liên quan.
Khi bạn thiết kế một mẫu nhà máy để tạo đối tượng trong ứng dụng
của bạn, có những lúc bạn muốn một tập hợp các đối tượng liên quan cụ
thể được tạo với các ràng buộc nhất định và áp dụng logic mong muốn trên
các đối tượng liên quan trong ứng dụng của bạn. Bạn có thể đạt được thiết
kế này bằng cách tạo một nhà máy khác bên trong nhà máy cho một bộ các
đối tượng liên quan và áp dụng các ràng buộc cần thiết. Bạn cũng có thể
lập trình logic cho một tập hợp các đối tượng liên quan.
Khi bạn muốn tùy chỉnh logic khởi tạo của các đối tượng liên quan,
thì bạn có thể sử dụng mẫu thiết kế này.
12
LocalSessionFactoryBean,
Một FactoryBean cũng hữu ích để giúp xây dựng đối tượng Spring
mà bản thân nó không dễ dàng tự xây dựng được.Thường thì điều này
được sử dụng để xây dựng các đối tượng phức tạp có nhiều phụ thuộc. Nó
cũng có thể được sử dụng khi bản thân logic xây dựng rất biến động và phụ
thuộc vào cấu hình.
Đảm bảo một lớp chỉ có một trường hợp và cung cấp một điểm truy
cập toàn cầu cho nó.
Mẫu singleton này là một trong những mẫu thiết kế đơn giản nhất
trong Java.Theo mẫu thiết kế này, lớp cung cấp cùng một đối tượng cho
mỗi cuộc gọi-nghĩa là nó đang hạn chế việc khởi tạo một lớp cho một đối
tượng và cung cấp một điểm truy cập toàn cầu vào lớp đó.
Vì vậy, lớp sẽ chịu trách nhiệm tạo một đối tượng và cũng đảm bảo
rằng chỉ nên tạo một đối tượng cho mỗi cuộc gọi của khách hàng(client)
cho đối tượng này.
Lớp này không cho phép khởi tạo trực tiếp một đối tượng của lớp
này. Nó cho phép có được một thể hiện đối tượng chỉ bằng một phương
thức tĩnh được tiếp xúc.
Điều này rất hữu ích khi chính xác một đối tượng là cần thiết để phối
hợp các hành động trên hệ thống. Bạn có thể tạo một mẫu duy nhất bằng
hai biểu mẫu, như được liệt kê ở đây:
13
+ Early instantiation: Tạo phiên bản vào thời điểm tải.
+ Lazy instantiation: Tạo phiên bản khi được yêu cầu.
+ Nó cung cấp quyền truy cập bộ điều khiển vào các lớp quan trọng
(thường là đối tượng nặng), chẳng hạn như lớp kết nối cho DB và lớp
sessionFactory trong Hibernate.
+ Nó giúp tiết kiệm hàng đống bộ nhớ.
+ Nó là một thiết kế rất hiệu quả cho môi trường đa luồng.
+ Nó linh hoạt hơn vì lớp kiểm soát quá trình khởi tạo và lớp có tính
linh hoạt để thay đổi quá trình khởi tạo.
+ Nó có độ trễ thấp.
Mẫu Singleton chỉ giải quyết được một vấn đề nếu bạn có một tài
nguyên chỉ có thể có một thể hiện duy nhất và bạn cần quản lý trường hợp
đó, thì bạn cần một singleton.
Thông thường, nếu muốn tạo kết nối cơ sở dữ liệu với cấu hình đã
cho trong môi trường phân phối và đa luồng, nếu không tuân theo thiết kế
singleton thì mọi luồng có thể tạo kết nối cơ sở dữ liệu mới với một đối
tượng cấu hình khác.
Với mẫu singleton, mỗi luồng có cùng đối tượng kết nối cơ sở dữ
liệu với cùng một đối tượng cấu hình trên hệ thống. Nó chủ yếu được sử
dụng trong các ứng dụng đa luồng và cơ sở dữ liệu. Nó được sử dụng trong
ghi nhật ký, lưu trữ, nhóm luồng, cài đặt cấu hình,...
14
Thực thi mẫu Singleton vào Spring Framework
Spring Framework cung cấp một phạm vi singleton bean như là mô hình
singleton, nó tương tự mẫu singleton, nhưng không giống hẳn singleton trong java.
Theo mẫu singleton, một phạm vi bean trong Spring framework có nghĩa là một bean
duy nhất trên mỗi container và mỗi bean. Nếu bạn xác định một bean cho một lớp cụ
thể trong một Spring container, thì sẽ tạo một và chỉ một thể hiện của lớp được xác
định bởi định nghĩa bean đó.
Chỉ định loại đối tượng để tạo bằng cách sử dụng một thể hiện
nguyên mẫu và tạo các đối tượng mới bằng cách sao chép nguyên mẫu này.
Mẫu này được sử dụng để tạo các đối tượng bằng cách sử dụng
phương thức nhân bản của các đối tượng. Nó được xác định bởi một ví dụ
nguyên mẫu. Trong ứng dụng doanh nghiệp, việc tạo đối tượng là tốn kém
về mặt tạo và khởi tạo các thuộc tính ban đầu của các đối tượng. Nếu một
loại đối tượng như vậy đã có trong tay, thì ta sẽ tìm mẫu prototype này.
Bạn chỉ cần sao chép một đối tượng tương tự hiện có thay vì tạo nó, đó là
tốn thời gian.
Mẫu này liên quan đến việc thực hiện giao diện nguyên mẫu, nó tạo
ra một bản sao của đối tượng hiện tại. Mẫu này được sử dụng khi tạo trực
tiếp đối tượng là tốn kém.
+ Giảm thời gian để tạo các đối tượng tốn thời gian.
+ Mô hình này làm giảm lớp con.
+ Mẫu này thêm và xóa các đối tượng trong thời gian chạy.
+ Mẫu này cấu hình ứng dụng với các lớp một cách linh hoạt.
15
Builder design pattern
Tách biệt việc xây dựng một đối tượng phức tạp khỏi biểu diễn của
nó để quá trình xây dựng tương tự có thể tạo ra các biểu diễn khác nhau.
Logic và quá trình tạo đối tượng phải là chung để bạn có thể sử dụng
nó để tạo các triển khai cụ thể khác nhau của cùng loại đối tượng. Mẫu này
đơn giản hóa việc xây dựng các đối tượng phức tạp và nó ẩn các dựng
được sử dụng để xây dựng một đối tượng phức tạp từng bước và cuối cùng
nó sẽ trả về đối tượng hoàn chỉnh chi tiết về cấu trúc của đối tượng từ mã
người gọi máy khách.
Khi bạn đang sử dụng mẫu này, hãy nhớ rằng bạn phải xây dựng nó
từng bước một, điều đó có nghĩa là bạn phải chia đăng nhập xây dựng đối
tượng thành nhiều giai đoạn, không giống như các mẫu khác, chẳng hạn
như nhà máy trừu tượng và mẫu nhà máy, mà đối tượng trong một bước
duy nhất.
+ Mô hình này cung cấp cho bạn sự cô lập hoàn toàn giữa việc xây
dựng và biểu diễn của một đối tượng.
+ Mẫu này cho phép bạn xây dựng đối tượng theo nhiều giai đoạn,
vì vậy bạn có quyền kiểm soát nhiều hơn đối với quy trình xây dựng.
+ Mẫu này cung cấp sự linh hoạt để thay đổi biểu diễn bên trong của
đối tượng.
16
xây dựng(builder) trong Spring Framework:
+ EmbeddedDatabaseBuilder.
+ AuthenticationManagerBuilder.
+ UriComponentsBuilder.
+ BeanDefinitionBuilder.
+ MockMvcWebClientBuilder.
Trong một ứng dụng doanh nghiệp, bạn có thể áp dụng mẫu trình xây
dựng trong đó việc tạo đối tượng đã được thực hiện bằng cách sử dụng
nhiều bước. Trong mỗi bước, bạn thực hiện một phần của quy trình. Trong
quy trình này, bạn đặt một số tham số cần thiết và một số tham số tùy chọn
và sau bước cuối cùng, bạn sẽ nhận được một đối tượng phức tạp.
Mẫu builder là một mẫu thiết kế phần mềm tạo đối tượng. Mục đích
là để trừu tượng các bước xây dựng để các triển khai khác nhau của các
bước này có thể xây dựng các biểu diễn khác nhau của các đối tượng.
Thông thường, mẫu xây dựng được sử dụng để xây dựng các sản phẩm
theo mẫu tổng hợp.
17
3. Consideration of Structural and Behavioral
Patterns
Tiếp tục các phần tiếp theo của GOF design pattern đó là structural and
behavioral design patterns
- Structural patterns cho phép chúng ta giải quyết nhiều vấn đề liên quan
tới cấu trúc quan hệ giữa các object.
- Liên kết các phần khác nhau của hệ thống lại với nhau và dễ dàng mở
rộng.
- Và đảm bảo việc 1 thành phần bị thay đổi thì các phần khác trong cấu
trúc hệ thống không phải thay đổi theo
Mẫu adapter
18
- 2 class không thể làm việc chung do không tương thích interface
- Mẫu adaper được sử dụng khi 2 interface trong phần mềm không tương
thích chức năng nhưng vẫn có thể tích hợp với nhau được
- Cho phép giao tiếp và tương tác được với 2 hay nhiều object không tương
thích nhau
- Phát triển khả năng tái sử dụng các chức năng đã triển khai trong phần
mềm
- Dùng adapter pattern khi muốn tạo 1 class mà có thể kết hợp với các
class khác không tương thích nhau
- Spring framework sử dụng các mẫu adapter để triển khai ra nhiều chức
năng tách biệt của framework
19
- The Adapter class: Là class bọc bên ngoài triển khai các interface mong
muốn và chỉnh sửa yêu cầu có trong class Adapee
- The Adaptee class: Class được class Adapter sử dụng để tái sử dụng
chức năng và chỉnh sửa chức năng sử dụng
- Mẫu bridge cho ta 1 cách thức để giao tiếp giữa 2 phần tử độc lập nhau
- Bridge pattern sử dụng 1 interface như là cầu nối giữa các class và
abstract class và các class đang triển khai interface. Dễ dàng thay đổi
chúng mà không ảnh hưởng đến mã nguồn của client
- Cho phép phân tách các triển khai và các lớp thuần ảo
- Linh hoạt trong việc thay đổi không ảnh hưởng code bên ngoài client
- Che giấu các triển khai không cho client thấy bằng cách chỉ cho client
sử dụng các lớp abstract
20
Các vấn đề thường thấy đã bị loại bỏ khi áp dụng mẫu cầu
- Xóa đi các liên kết giữa các chức năng ảo hóa và triển khai của nó
- Dễ dàng thay đổi các lớp đang triển khai mà không ảnh hưởng client
Các module spring dưới đây là dựa vào mẫu bridge:
- Mẫu cầu nối: The Bridge design pattern được sử dụng trong tiến trình
Spring logging
Mẫu composite
- Các object trong hệ thống được gom trong cấu trúc cây, cấu trúc cây là
sự liên kết của các nút lá và nhánh
Các vấn đề thường thấy được giải quyết bằng mẫu composite
- Mẫu Composite cho phép ta thiết kế các object để sử dụng các object
này như là 1 thành phần của các object khác và là 1 object riêng lẻ khác
- Tạo ra cấu trúc cây có thứ bậc rõ ràng để cung cấp client với cách sử
21
dụng tương tự nhau
Mẫu composite dựa trên thành phần của cấu trúc cây, cây có 3 phần
là nhánh, node và lá
- Cung cấp tính linh hoạt trong việc thêm component trong tiến trình, và
thay đổi trong các component hiện có
- Cho phép tạo class có lớp cấp bậc rõ ràng bao gồm các object riêng rẻ
và các object hỗn hợp
22
Mẫu decorator
- Decoratior design pattern cho phép thêm và loại bỏ các hành vi của các
object trong quá trình runtime một cách linh hoạt hoặc tĩnh mà không cần
thay đổi hành vi hiện có của các object từ cùng 1 class
- Mở rộng chức năng một cách linh hoạt và tĩnh mà không phải thay đổi
cấu trúc của các object hiện có
- Sử dụng các thành phần cho các quan hệ của các object để duy trì
nguyên tắc SOLID
- Triển khai mới class cho mỗi chức năng mới thay vì thay đổi code hiện
tại của ứng dụng
Các vấn đề thường thấy được giải quyết bằng mẫu Decorator
23
Các lớp và đối tượng tương tác với nhau:
Mẫu Facade
- Giảm thiểu tính phức tạp cho client khi tương tác với các hệ thống con
- Mẫu này kết hợp tất cả bussiness service như là một interface để dễ
dàng hiểu rõ
- Mẫu giảm thiểu các phụ thuộc của mã nguồn client trong phần làm
việc của hệ thống
Ví dụ bạn cần phát triển một phần mềm bank cho doanh nghiệp với
nhiều service để làm việc bạn cần (AccountService, TranferService), Mã
nguồn của client sẽ tương tác với tất cả service này để chuyển tiền từ tài
khoản này sang tài khoản khác
24
Mã nguồn client trực tiếp tương tác với các class trong hệ thống con,
có thể mô tả 1 hoặc nhiều interface giúp cho hệ thống con dễ sử dụng hơn
Mẫu ủy quyền
- Cung cấp 1 đối tượng của 1 class với chức năng của tất cả class còn lại
cần tới nó
- Mục đích của mẫu là cung cấp một class thay thế cho class khác, đi
cùng với đó là chức năng
25
Mục đích của mẫu ủy quyền
- Mẫu Proxy ẩn giấu object xử lí không cho bên ngoài xem được
- Tạo object theo nhu cầu nên có thể nâng cao hiệu suất
- Subject: Interface thật sự được triển khai bởi mẫu Proxy và RealSubject
- RealSubject: Thực tế việc triển khai Subject, là một object thật sự rằng
được đại diện bởi Proxy
- Proxy: Nó là một proxy object và nó cũng là triển khai của object thật
sự của Subject, nó duy trì việc giới thiệu đến object thật sự
- Mẫu thuộc loại Behavioral là giao tiếp và hợp tác giữa các object để
vận hành một nhiệm vụ mà không một object nào có thể vận hành được
- Mẫu thuộc loại này triển khai các phương pháp mà các class và object
liên kết và đóng góp nhiệm vụ
26
- Sender và receivers của request được tách ra, sender gửi request đến
chuỗi của receivers và 1 trong số receiver object có thể đảm nhận request
- Giảm thiểu sự liên kết giữa sender và receiver object trong hệ thống để
giải quyết request
- Tạo một chuỗi object sử dụng tính thành phần, và tập các object này
làm việc như một đơn vị duy nhất
- Client: lớp ứng dụng để khởi tạo nên request cho các object xử lí
request trong chuỗi
- Đóng gói request data trong 1 object và đưa các object đó như là mệnh
lệnh tới phương thức, trả về là mệnh lệnh là 1 object.
- Cho phép truyền data như là object giữa các phần tử trong hệ thống
người gửi và nhận
27
- Thêm các lệnh trong hệ thống mà không phải thay đổi class hiện tại
- Client: Là class main, tạo ra một Concrete command object và gán cho
receiver
Mẫu interpreter cho phép bạn thông dịch một thể hiện ngôn ngữ
trong lập trình để khởi tạo một bản trình bày .
28
- AbstractExpression: Là interface để thực thi nhiệm vụ bởi sử dụng
interpreter operation
- Context: Là chuỗi operation và nó bao gồm thông tin cục bộ cho thông
dịch
- Có thể truy cập nhiều item cùng lúc từ collection bởi vì nó hỗ trợ nhiều
các biến thể
- Cung cấp một uniform interface để vượt qua nhiều cấu trúc khác nhau
trong collection
29
- Iterator: Là interface hoặc lớp ảo để truy cập các items của collection
Trong mẫu template, một lớp ảo sẽ bao gói các khởi tạo vào method.
Method đó sẽ cho phép kế thừa không được sửa method này. Có thể sử
dụng concrete class trong phần mềm bạn để hành xử một số loại hành
động
- Giảm thiểu code bản mẫu trong phần mềm bằng việc sử dụng lại code
- Mẫu tạo ra một số template hoặc cách thức để sử dụng lại nhiều thuật
toán để hiện thực các yêu cầu bài toán
30
- AbstractClass: Là lớp ảo bao gồm các method của template là xương
sống của thuật toán
Mẫu thiết kế của Java EE cung cấp phương pháp kiểm thử và luyện
tập cho các tương tác của object trong nhiều tầng khác nhau của ứng dụng.
Bao gồm 3 phân lớp
· View helper: Nó phân tách các view từ business logic của ứng dụng
J2EE doanh nghiệp
· Front Controller: Cung cấp một điểm hành động để đảm nhiệm các
request đến ứng dụng J2EE, đưa các request đến các controller để truy cập
model và view cho tầng trình bày có dữ liệu
31
· Application Controller: Request dược đảm nhiệm bởi controller, nó như
là một controller helper đứng bên ngoài. Phản hồi cho việc phối hợp với
tầng bussiness và view
· Dispatcher View: Liên quan đến view và chỉ hoạt động mà không có
bussiness logic để sẵn sàng cho view tiếp theo
· Intercepting filters: Cấu hình nhiều bộ lọc cho pre và post và request từ
user và kiểm kê các request từ user
· Application service: Cung cấp các business logic để triển khai model
như là các java object cho tầng trình bày
· Data Access Object: được triển khai để truy cập data và nó phân tách
data truy cập logic từ business logic trong ứng dụng
· Web service broker: Đóng gói logic để truy cập tài nguyên ứng dụng và
nó lộ ra như là một web service
32
4. Wiring Beans using the Dependency Injection Pattern.
Dependency injection là một mẫu thiết kế, thúc đẩy các lớp được
ghép nối lỏng lẻo trong ứng dụng. Điều này có nghĩa là các lớp trong hệ
thống phụ thuộc vào hành vi của những lớp khác, và không phụ thuộc vào
việc khởi tạo đối tượng của các lớp. Mẫu injection phụ thuộc cũng thúc
đẩy lập trình đến giao diện thay vì lập trình để thực thi. Các phụ thuộc đối
tượng phải nằm trên một giao diện chứ không phải trên các lớp cụ thể. Một
cấu trúc được kết hợp lỏng lẻo cung cấp cho bạn khả năng tái sử dụng, khả
năng bảo trì và khả năng test cao hơn.
Điểm mạnh
Dựa trên cấu trúc phù hợp hơn với các phụ thuộc bắt buộc và nó tạo ra một
hợp đồng phụ thuộc mạnh mẽ.
Cung cấp một cấu trúc mã nhỏ gọn hơn các cấu trúc khác.
33
Hỗ trợ kiểm tra bằng cách sử dụng các phụ thuộc được chuyển làm đối số
của hàm tạo cho lớp phụ thuộc.
Sử dụng các đối tượng bất biến, và không phá vỡ nguyên tắc che giấu
thông tin.
Điểm Yếu
Nó có thể gây ra sự phụ thuộc vòng tròn
Điểm mạnh
Giải quyết vấn đề phụ thuộc vòng tròn trong ứng dụng
Cho phép các tài nguyên hoặc dịch vụ tốn kém được tạo càng muộn càng
tốt và chỉ khi cần thiết
Không yêu cầu thay đổi hàm tạo, nhưng các phụ thuộc được chuyển qua
các thuộc tính công khai được hiển thị
Điểm Yếu
Tính bảo mật thấp hơn trong mẫu chèn setter, vì nó có thể bị ghi đè.
Việc chèn phụ thuộc dựa trên setter không cung cấp cấu trúc mã nhỏ gọn
như chèn hàm tạo Hãy cẩn thận bất cứ khi nào bạn sử dụng setter
injection, vì nó không phải là phụ thuộc bắt buộc
Cấu hình dựa trên chú thích — nó là một khám phá bean ngầm và liên kết
tự động.
Cấu hình dựa trên XML — nó là một file cấu hình rõ ràng trong
XML(Application.XML).
2. Annotating beans for autowiring Lookup-method injection
pattern
Spring hỗ trợ tự động tiêm phụ thuộc. Điều này có nghĩa là Spring tự động
giải quyết các phụ thuộc được yêu cầu bằng cách tìm các bean cộng tác
trong ngữ cảnh ứng dụng. Bean Autowiring là một cách khác của cấu hình
mẫu DI. Nó làm giảm tính dài dòng trong ứng dụng. Chú thích
@Autowired mong muốn của Spring được sử dụng để nối dây đậu tự
động. Chú thích @Autowired này cho biết rằng sẽ thực hiện tự động khởi
tạo cho bean này.
Spring Framework cung cấp FactoryBean như một phần triển khai
của mẫu Nhà Máy. FactoryBean là một mẫu để đóng gói logic xây dựng
đối tượng thú vị trong một lớp. Giao diện FactoryBean cung cấp một cách
để tùy chỉnh logic khởi tạo của Spring IoC container. Bạn có thể triển khai
35
giao diện này cho các đối tượng tự là nhà máy. Bean thực hiện
FactoryBean được tự động phát hiện.
a) EmbeddedDatabaseFactoryBean
b) JndiObjectFactoryBean
c) LocalContainerEntityManagerFactoryBean
d) DateTimeFormatterFactoryBean
e) ProxyFactoryBean
f) TransactionProxyFactoryBean
g) MethodInvokingFactoryBean
1. Mẫu Adapter:
- Adapter Pattern giữ vai trò trung gian giữa hai lớp, chuyển đổi interface
của một hay nhiều lớp có sẵn thành một interface khác, thích hợp cho lớp
đang viết. Điều này cho phép các lớp có các interface khác nhau có thể dễ
36
dàng giao tiếp tốt với nhau thông qua interface trung gian, không cần thay
đổi code của lớp có sẵn cũng như lớp đang viết.
- Code ví dụ: ta có một ứng dụng chỉ tương thích với class hiển thị tiếng
Việt bây giờ ta muốn chương trình hoạt động bằng tiếng Anh. Nhờ mẫu
Adapter ta dễ dàng có thể triển khai một lớp mới mà không cần phải thay
đổi bên trong lớp tiếng Việt.
- Class diagram:
2. Bridge:
- Bridge Pattern dùng để tách phần trừu tượng ra khỏi phần hiện thực. Có
nghĩa là ban đầu chúng ta thiết kế một class với rất nhiều xử lý, bây giờ
chúng ta không muốn để những xử lý đó trong class đó nữa. Vì thế, chúng
ta sẽ tạo ra một class khác và move các xử lý đó qua class mới. Khi đó,
trong lớp cũ sẽ giữ một đối tượng thuộc về lớp mới, và đối tượng này sẽ
chịu trách nhiệm xử lý thay cho lớp ban đầu.
- Code ví dụ: ta xây dựng một hệ thống cung cấp các loại tài khoản cho
37
khách hàng và hỗ trợ nhiều ngân hàng khác nhau, nếu không áp dụng mẫu
Bridge thì bấy nhiêu ngân hàng và bấy nhiêu loại tài khoản sẽ có bấy nhiêu
class. Vậy ta sẽ tách phần tài khoản ra khỏi ngân hàng
- Class diagram:
3. Mẫu Composite:
- Code ví dụ: ta có các phòng ban, có các phòng ban trực thuộc phòng
ban khác và các phòng ban trực thuộc này lại có phòng ban khác trực
thuộc khác, tạo nên một cây phân cấp. Ta muốn biết tên của các phòng ban
này. Rất khó nếu tiếp cận với cách bình thường là lặp qua mọi phòng ban
để lấy tên bởi vì ta khó mà biết được số cấp của phòng ban và kiểu dữ liệu
để chứa mỗi phòng ban là khác nhau.
- Ở mẫu composite, các phòng ban sẽ triển khai chung một interface có
phương thức trả về tên phòng ban. Mỗi phòng ban có nhiệm vụ chính là trả
về tên. Đối với phòng ban có phòng ban khác trực thuộc nó sẽ lặp qua mỗi
phòng ban trực thuộc và lấy tên.
- Class diagram:
38
4. Mẫu Decorator:
- Code ví dụ: ta có một chương trình có chức năng nén, mã hóa khi ghi
ra file. Đồng thời có chức năng giải nén, giải mã khi đọc file. Lúc đầu ta
có thể nghĩ đến mẫu bridge để áp dụng cho ví dụ này nhưng có yêu cầu ở
đây là bên phía client có thể tùy ý thêm nhiều các chức năng ngoài nén và
mã hóa.
- Ý tưởng của mẫu Decorator khá là giống với mẫu Adapter là sử dụng
đối tượng bọc nhưng mục đích của hai mẫu này là khác nhau. Adapter là
cung cấp (biến đổi) interface của đối tượng, còn Decorator là tăng cường
thêm hành vi cho interface
- Các class trong mẫu Decorator thực hiện chung một interface. Mẫu
này hoạt động dựa vào đệ quy, khi đối tượng này thực hiện phương thức
này sẽ ủy thác cho đối tượng được bọc thực hiện phương thức tương tự.
- Class diagram:
39
5. Mẫu Facade:
- Code ví dụ: ta có các lớp là thành phần của động cơ. Để khởi động
động cơ ta cần phải trải qua nhiều bước, qua nhiều hệ thống. Ta cần phải
có một class để điều khiển các hoạt động này, cách làm này khá giống với
controller trong MVC
- Mẫu Façade cách làm khá giống với mẫu Mediator vì hai mẫu này sinh
ra để tổ chức sự hợp tác của các lớp. Điều khác ở đây ở mẫu Façade là các
hệ thống con có thể tương tác được với nhau là các hệ thống con không hề
biết gì về Façade.
- Mẫu Façade thường dùng để tạo giao tiếp giữa các hệ thống này qua hệ
thống khác hay là lúc ta sử dụng framework.
- Class Diagram:
6. Mẫu Flyweight:
- Mẫu Flyweight đúng với cái tên của nó là làm giảm bộ nhớ của hệ thống
40
hay còn gọi là cache. Bằng cách lưu các trạng thái không đổi của đối
tượng sang một đối tượng cache, khi tạo đối tượng ta sẽ lấy trạng thái
không đổi ở trong cache đưa vào.
- Code ví dụ: ta muốn vẽ hoa trên canvas, các trạng thái không đổi của hoa
là tên và màu sẽ được đưa vào class FlowerFactory. Khi đối tượng Garden
thực hiện phương thức plantFlower, ta sẽ tạo đối tượng hoa ta lấy trạng
thái không đổi từ đối tượng Factory đưa vào constructor của Flower.
- Class Diagram:
7. Mẫu Proxy:
- Mục đích của mẫu proxy là thay vì truy cập trực tiếp vào đối tượng thì
ta sẽ truy cập vào đối tượng đại diện. Đối tượng proxy sẽ triển khai giao
diện giống với đối tượng thực và bọc nó. Khi đối tượng proxy thực hiện
phương thức nó sẽ gọi phương thức của đối tượng thực.
- Class Digram:
41
8. Mẫu Factory Method:
- Mẫu Factory được dùng để tạo đối tượng, mục đích của mẫu này khá
nhiều. Dùng mẫu khi chưa biết trước các loại đối tượng nào sẽ được khởi
tạo (if else). Trong mẫu factory method các lớp con là lớp chính chịu trách
nhiệm tạo đối tượng vì thế hệ thống rất dễ dàng mở rộng bằng cách tạo lớp
con mới triển khai lớp cha đã có. Ta có thể tiết kiệm tài nguyên khi phải
tạo các đối tượng giống nhau nhiều lần. Thường trong hệ thống lớn các đối
tượng phải hoạt động ăn khớp với nhau, sử dụng mẫu factory để kiểm soát
đối tượng được tạo để hệ thống được hoạt động trơn tru.
- Code ví dụ: ta có các text view: text dành cho window và text dành cho
web. Tùy thuộc vào hệ thống thì sẽ render các text khác nhau. Ví dụ này là
lợi ích đầu tiên của mẫu factory là chưa biết trước là đối tượng nào sẽ
được khởi tạo.
- Class Diagram:
9. Abstract Factory:
- Mẫu Factory có mục đích là tạo một loại đối tượng, nếu ta muốn tạo ra
một bộ các đối tượng ăn khớp với nhau thì như thế nào. Trong 22 mẫu của
GoF đã giới thiệu một mẫu có tên là Abstract Factory, mẫu này kế thừa
những ưu điểm của Factory Method và cho phép chúng ta tạo ra các bộ đối
tượng.
- Code ví dụ: ta có bộ các GUI là Input và Label, ta muốn cho các GUI
này hoạt động được trên cả window và macOS.
- Class Diagram:
42
10. Builder:
- Mẫu Builder giúp ta tạo đối tượng bằng cách các tùy chọn, tinh chỉnh.
Giúp ta xây dựng đối tượng phức tạp từng bước.
- Code ví dụ: ta muốn tạo ra chương trình để tạo ta câu lệch SQL, để tạo
ra câu lệch sql rất phức tạp, các câu lệch thêm bớt tùy chỉnh rất linh hoạt vì
vậy mẫu builder rất phù hợp.
- Class Diagram:
11. Singleton:
43
thống thường dùng để truy cập vào tài nguyên như File hay Database.
- Ví dụ dưới đây là tạo ra instance duy nhất để kết nối vào database
12. Prototype:
- Mẫu prototype dùng để sao chép đối tượng, mẫu này cực hữu ích
khi được dùng để sao chép các đối tượng phức tạp được tạo từ mẫu như
Composite và Decorator giúp giảm thời gian để tạo lại từ đầu
- Code ví dụ: Máy tính trong nhà trường gồm: Hệ điều hành (os), Phần
mềm văn phòng (office), Phần mềm diệt virus (antivirus), Trình duyệt
(Browser), và một số phần mềm khác (others). Việc cài đặt tất cả phần
mềm trên rất tốn thời gian, nên anh IT đã nghĩ ra một cách là sẽ tạo ra một
bản chuẩn cho một máy tính và có thể clone() lại cấu hình đó từ đầu.
- Class Diagram
44
5.3. Behavior Pattern:
- Mẫu này thường được sử dụng khi chương trình sẽ đi qua các trình
xử lý yêu cầu khác nhau nhưng ta vẫn chưa biết chính xác là cần bao nhiêu
trình xử lý.
- Code ví dụ: ta có một chương trình để filter việc login của người
dùng. Khi người dùng login vào hệ thống, thì sẽ qua các giai đoạn filter
như sau: kiểm tra tải hệ thống → kiểm tra tài khoản mật khẩu → kiểm tra
quyền người dùng. Tài khoản của người dùng sẽ trải qua từng filter, nếu
filter này pass thành công sẽ chuyển qua cho filter khác nếu không sẽ dừng
lại.
- Class diagram:
45
14. Command:
- Mẫu Command có mục đích dùng để tách rời logic thực hiện hành
động ra khỏi đối tượng yêu cầu hành động, ngoài ra nhờ cách tách rời
logic yêu cầu hành động ta có thể đưa các yêu cầu này cho nhiều đối tượng
khác nhau. Ví dụ: khi ta đến nhà hàng ngồi vào bàn và gọi nhân viên sẽ
đến và ghi lại menu chuyển qua cho đầu bếp, ở đây khách hàng không trực
tiếp đưa menu cho đầu bếp mà đã đóng gói command (menu) cho phục vụ.
Ưu điểm: ta có thể thực hiện hành động undo/redo, bằng cách đóng gói các
lệnh lại ta có thể dàng tái sử dụng.
- Code ví dụ: ta có một hệ thống ngân hàng cung cấp ứng dụng cho khách
hàng (client) có thể mở (open) hoặc đóng (close) tài khoản trực tuyến.
- Class Diagram:
46
15. Iterator:
- Iterator như với cái tên, mẫu này được dùng để lặp qua các phần tử
của một collection mà không cần phải biết chi tiết bên trong các tử này,
chỉ cần cho các item triển khai cùng một interface. Ví dụ: ta có các cấu
trúc như: HashTabel, Stack, Queue, LinkedList... Để truy cập vào từng
item của các cấu trúc khá là khó khăn dó cách truy xuất item của mỗi cấu
trúc là khác nhau. Sử dụng mẫu Iterator tuyên bố một interface chung triển
khai method để truy cập đến từng phần tử.
- Ở các ngôn ngữ hiện đại (c#...), vòng lặp for sử dụng interface rất
giống với mẫu Iterator để lặp qua các item, sử dụng mẫu Iterator để bạn có
thể tùy chỉnh cho vòng lặp của mình
- Code ví dụ: ta muốn tạo đối tượng Iterator để lưu trữ các từ sau đó
dùng vòng lặp để in ra các thành phần có trong nó.
- Class Diagram:
47
16. Mediator:
- Đây là một mẫu dùng để kiểm soát sự phụ thuộc hỗn loạn giữa các
đối tượng với nhau. Thay vì cho phép các đối tượng phụ thuộc trực tiếp
với nhau như vậy, ta sẽ ràng buộc các đối tượng để giao tiếp được với các
đối tượng khác phải qua đối tượng trung giang.
- Mẫu này khá giống mẫu Façade chỉ khác nhau đó chính là các đối
tượng con biết về đối tượng trung gian và không giao tiếp trực tiếp, còn
Façade thì các đối tượng con không giao tiếp với nhau cũng không biết
đến đối tượng trung giang.
- Code ví dụ: ta có một chương trình chat nhóm khi một thành viên chat thì
tất cả các thành viên khác trong room đều nhận được. Thay vì cho phép
lớp user tự phải tìm các thành viên trong room, kiểm tra xem thành viên có
đang online hay là thành viên đó có muốn nhận chat từ mình không. Ta sử
dụng mẫu Mediator thì user không cần phải quan tâm, chỉ cần gửi chat cho
mediator lo liệu.
- Class Diagram
48
17. Memento:
- Đôi khi chúng ta cần phải ghi lại trạng thái bên trong của một đối
tượng. Chúng ta cần lưu các trạng thái này ở đối tượng nào đó. Nhưng có
vấn đề ở đây là các thuộc tính của đối tượng lưu trữ để public thì dễ bị tác
nhân bên ngoài thay đổi, private thì khó mà truy cập được. Mẫu memento
sẽ giúp ta giải quyết vấn đề này.
- Code ví dụ: ta muốn tạo chương trình để quản lý tọa độ, chương
trình cho phép chúng ta khôi phục lại dữ liệu tại thời điểm trước đó
- Class Diagram:
49
18. Observer:
- Trong trường hợp khi một số đối tượng nhất định cần được thông
báo thường xuyên về những thay đổi xảy ra trong các đối tượng khác. Mẫu
Observer có thể được sử dụng bất cứ khi nào mà một đối tượng có sự thay
đổi trạng thái, tất các thành phần phụ thuộc của nó sẽ được thông báo và
cập nhật một cách tự động.
- Code ví dụ: ta có một đối tượng chứa các số liệu về thời tiết và các
đối tượng dùng để hiển thị các số liệu này, dùng mẫu Observer để khi số
liệu trong đối tượng thời tiết thay đổi thì các đối tượng hiển thị sẽ ngay lập
tức cập nhật số liệu mới.
- Class Diagram:
19. Strategy:
- Có một vài trường hợp, các lớp chỉ khác nhau về hành vi của
50
chúng. Trong trường hợp như vậy, ý tưởng tốt là chúng ta sẽ tách biệt các
thuật toán trong các lớp riêng biệt để có khả năng lựa chọn các thuật toán
khác nhau trong thời gian chạy (run-time). Ý tưởng này được gọi là
Strategy Pattern, một pattern giúp chúng ta giải quyết vấn đề về sự thay
đổi.
- Code ví dụ: ta có một chương trình triển khai nhiều giải thuật sắp
xếp khác nhau (QuickSort, MergeSort…) để sắp xếp lại danh sách. Bằng
cách sử dụng mẫu Strategy ta có thể hoán đổi linh hoạt các giải thuật mà
không cần phải tạo thêm class mới, ví dụ: SortedList, MergeSort…
- Class Diagram:
- Trong quá trình phát triển ứng dụng một số lớp có các thuật toán
gần như giống nhau, chỉ khác nhau ở vài chi tiết nhỏ, do đó ta phải sửa đổi
lại thuật toán ban đầu.
- Thông thường trong giải thuật sắp xếp, các thành phần trong
collection đều là các con số nguyên thủy nếu ta muốn thực hiện sắp xếp
cho các thành phần có cấu trúc dữ liệu phức tạp thì như thế nào.
- Code ví dụ: sử dụng mẫu Template Method để sắp xếp theo tuổi,
51
theo tên cho cấu trúc dữ liệu học sinh.
- Class Diagram:
21. Visitor:
- Visitor cho phép định nghĩa các thao tác (operations) trên một tập
hợp các đối tượng (objects) không đồng nhất (về kiểu) mà không làm thay
đổi định nghĩa về lớp (classes) của các đối tượng đó. Để đạt được điều
này, trong mẫu thiết kế visitor ta định nghĩa các thao tác trên các lớp tách
biệt gọi các lớp visitors, các lớp này cho phép tách rời các thao tác với các
đối tượng mà nó tác động đến. Với mỗi thao tác được thêm vào, một lớp
visitor tương ứng được tạo ra.
- Code ví dụ: ta có một chương trình truy cập vào các trường của các
shape để xuất ra định dạng XML
- Class Diagram:
52
22. State:
- State Pattern là mẫu cho phép đối tượng có nhiều hành vi dựa vào
trạng thái bên trong của nó, đối tượng có được hành vi nhờ ủy thác cho đối
tượng mang trạng thái. Mẫu State khá giống với mẫu Strategy, nhưng mẫu
State thay đổi hành vi dựa vào trạng thái của nó, mẫu Strategy tự mình
quyết định nên sử dụng hành vi nào.
- Code ví dụ: ta cần xây dựng một ứng dụng quản lý Document. Một
Document có thể bao gồm các trạng thái: tạo mới (New), đã đăng
(Submitted), phê duyệt (Approved) và từ chối (Rejected).
- Class Diagram:
53
5.4. Các mẫu mở rộng:
- Null Object Pattern là một trong những Pattern thuộc nhóm hành vi
(Behavior Pattern). Null Object pattern không phải là một Gang of Four
Design Pattern.
Tư tưởng của Null Object là sử dụng một đối tượng Null đặc biệt để
gói gọn sự vắng mặt của một thể hiện bằng cách cung cấp một sự thay thế
hành xử theo cách thụ động phù hợp.
AbstractObject : định nghĩa các hành vi mà một đối tượng có thể có.
NullObject : một triển khai không làm gì hoặc trả về giá trị mặc định
của AbstractObject, để cung cấp một đối tượng không null cho Client.
Client : nhận được một triển khai của AbstractObject và sử dụng nó.
Nó không thực sự quan tâm đó là một NullObject hoặc RealObject vì cả
hai đều được sử dụng theo cùng một cách.
54
24. Interpreter Pattern:
Interpreter nghĩa là thông dịch, mẫu này nói rằng “để xác định một
biểu diễn ngữ pháp của một ngôn ngữ cụ thể, cùng với một thông dịch
viên sử dụng biểu diễn này để diễn dịch các câu trong ngôn ngữ”.
nterpreter Pattern có hạn chế về phạm vi áp dụng. Mẫu này thường được
sử dụng để định nghĩa bộ ngữ pháp đơn giản (grammar), trong các công cụ
quy tắc đơn giản (rule), …
· Context : là phần chứa thông tin biểu diễn mẫu chúng ta cần
xây dựng.
55
· TerminalExpression (biểu thức đầu cuối): cài đặt các phương
thức của Expression, là những biểu thức có thể được diễn giải trong một
đối tượng duy nhất, chứa các xử lý logic để đưa thông tin của context
thành đối tượng cụ thể.
56
25. MVC Pattern:
· MVC chia ứng dụng phần mềm ra làm 3 phần có tương tác với
nhau: Model (dữ liệu), View (giao diện), Controller (điều khiển tương tác
giữa Model và View).
· Model : là nơi lưu trữ dữ liệu người dùng, chứa business logic.
Nó cho phép truy xuất dữ liệu để hiển thị hoặc thu thập dữ liệu. Model là
cầu nối giữa thành phần View và Controller. Mục đích quan trọng nhất của
nó là kết nối cơ sở dữ liệu (database), xử lý dữ liệu và chuẩn bị dữ liệu để
chuyển đến các thành phần khác.
· View : là giao diện của hệ thống, nơi dữ liệu (Model) được hiển
thị, nhận tương tác trực tiếp với người dùng. Trong ứng dụng web, View là
một phần của hệ thống, nơi mà các mã HTML được sinh ra và hiển thị.
Một vấn đề quan trọng là View không được lấy dữ liệu trực tiếp từ
Controller mà phải thông qua Model.
57
26. Dependency Injection Pattern:
Với lập trình hướng đối tượng, chúng ta thường xuyên làm việc với
rất nhiều class trong một chương trình, các class được liên kết với nhau
theo một mối quan hệ nào đó. Dependency là một loại quan hệ giữa 2 class
mà trong đó một class hoạt động độc lập và class còn lại phụ thuộc bởi
class kia. Sự phụ thuộc chặt chẽ này gây rất nhiều khó khăn khi hệ thống
cần thay đổi, nâng cấp. Để giải quyết vấn đề này chúng ta có thể sử dụng
Dependency Injection (DI), một dạng design pattern được thiết kế nhằm
ngăn chặn sự phụ thuộc nêu trên.
58
27. Dao Pattern:
Data Access Object (DAO) Pattern là một trong những Pattern thuộc
nhóm cấu trúc (Structural Pattern). Mẫu thiết kế DAO được sử dụng để
phân tách logic lưu trữ dữ liệu trong một lớp riêng biệt. Theo cách này, các
service được che dấu về cách các hoạt động cấp thấp để truy cập cơ sở dữ
liệu được thực hiện. Nó còn được gọi là nguyên tắc Tách logic (Separation
of Logic).
Các thành phần tham gia mẫu Data Access Object (DAO) Pattern:
· BusinessObject : đại diện cho Client, yêu cầu truy cập vào
nguồn dữ liệu để lấy và lưu trữ dữ liệu.
59
định nghĩa trong DAO, lớp này sẽ thao tác trực tiếp với nguồn dữ liệu
(DataSource).
Các Filter được định nghĩa và áp dụng trên yêu cầu (request) khi
chuyển request đến ứng dụng đích thực tế (target). Các Filter có thể thực
hiện xác thực (authentication), ủy quyền (authorization), nén dữ liệu
(compressing), ghi nhật ký (logging) hoặc theo dõi yêu cầu (tracking) và
sau đó chuyển yêu cầu đến các trình xử lý tương ứng.
· Filter : chịu trách nhiệm thực hiện một vài xử lý trước khi
request được target xử lý hoặc sau khi response được trả về từ target.
· Filter chain : chứa một chuỗi các Filter sẽ được thực hiện trên
target theo thứ tự được xác định.
· Client : đối tượng gửi request đến target hoặc nhận response từ
target.
60
29. Service locator Pattern
Service Locator là một design pattern thông dụng cho phép tách rời
(decouple) một class với các dependency (hay được gọi là service) của nó.
Service Locator có thể coi là một đối tượng trung gian trong việc liên kết
class và các dependency.
61
Tài Liệu Tham Khảo
https://libribook.com/ebook/7950/spring-5-design-patterns-pdf/?
bookid=45368
Behavior Pattern
https://gpcoder.com/category/design-pattern/behavior-pattern/
Creational Pattern
https://gpcoder.com/category/design-pattern/creational-pattern/
Structural Pattern
https://gpcoder.com/category/design-pattern/structuaral-pattern/
62