Báo cáo cuối kỳ môn Thiết kế phần mềm đề tài "Tìm hiểu về Design Pattern trong C++ | Đại học Sư phạm Kỹ thuật Thành phố Hồ Chí Minh

Báo cáo cuối kỳ môn Thiết kế phần mềm đề tài "Tìm hiểu về Design Pattern trong C++ của Đại học Sư phạm Kỹ thuật Thành phố Hồ Chí Minh với những kiến thức và thông tin bổ ích giúp sinh viên tham khảo, ôn luyện và phục vụ nhu cầu học tập của mình cụ thể là có định hướng ôn tập, nắm vững kiến thức môn học và làm bài tốt trong những bài kiểm tra, bài tiểu luận, bài tập kết thúc học phần, từ đó học tập tốt và có kết quả cao cũng như có thể vận dụng tốt những kiến thức mình đã học vào thực tiễn cuộc sống. Mời bạn đọc đón xem!

 

lOMoARcPSD|36625228
TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT
TP.HCM
KHOA CÔNG NGHỆ THÔNG TIN
BÁO CÁO CUỐI
TÌM HIỂU VỀ DESIGN PATTERN
TRONG C++
lOMoARcPSD|36625228
ĐỒ ÁN MÔN HỌC MẪU THIẾT KẾ PHẦN MỀM
HỌC KÌ II, NĂM HỌC 2022 2023
- Tên đề tài: TÌM HIỂU VỀ DESIGN PATTERN TRONG C++
- Thời gian thực hiện: Từ: 26/03/2022 Đến: 5/6/2022
- Giáo viên hướng dẫn: TS. Huỳnh Xuân Phụng - Yêu cầu của đề tài:
1. SOLID Design principle in C++
2. Pattern:
Builder
Adapter
Composite
Facade
Command
Memento
Visitor
Strategy
3. Project minh họa
- Lớp: 212DEPA330879_04CLC
NHẬN XÉT
ĐIỂM SỐ
Sinh viên thực hiện
:
-
ST
T
HỌ TÊN
MSSV
TÊN
THAM GIA
(
%
)
1
%
2
%
Ghi chú:
Tỷ lệ % = 100%
TIÊU
CHÍ
NỘI DUNG
TRÌNH BÀY
TỔNG
ĐIỂM
lOMoARcPSD|36625228
Mục Lục
LỜI CẢM ƠN 1
ĐỒ ÁN MÔN HỌC MẪU THIẾT KẾ PHẦN MỀM 2
NHẬN XÉT 3
MỞ ĐẦU 5
SOLID principle in C++ 10
S -Single responsibility principle ( Nguyên tắc trách nhiệm đơn lẻ ) 10
Open/closed principle ( Nguyên tắc đóng mở ) 10
L - Liskov substitution principle 11
I - Interface segregation principle ( Nguyên tắc phân tách giao diện ) 12
D - Dependency inversion principle ( Nguyên tắc đảo ngược phụ thuộc ) 13
Builder Method Pattern 14
Builder Method Pattern là gì? 14
Sử dụng Builder Pattern khi nào? 14
Lợi ích của Builder Pattern là gì? 15
Adapter Pattern 15
Adapter Pattern là gì? 15
Lợi ích của Adapter Pattern là gì? 16
Sử dụng Adapter Pattern khi nào? 16
Composite pattern 16
Composite Pattern là gì? 16
Lợi ích của Composite Pattern là gì? 17
Sử dụng Composite Pattern khi nào? 17
Facade pattern 17
Facade Pattern là gì? 18
Lợi ích của Facade Pattern là gì? 18
Sử dụng Facade Pattern khi nào? 18
Command pattern 19
Command pattern là gì? 19
Lợi ích của Command Pattern là gì? 20
Sử dụng Command Pattern khi nào? 20
lOMoARcPSD|36625228
Memento Pattern 20
Memento Pattern là gì? 20
Lợi ích của Memento Pattern là gì? 21
Sử dụng Memento khi nào? 21
Visitor Pattern 21
Visitor Pattern là gì? 21
Lợi ích của Visitor Pattern là gì? 21
Sử dụng Visitor Pattern khi nào? 21
Strategy Pattern 22
Strategy Pattern là gì? 22
Lợi ích của Strategy Pattern là gì? 22
Sử dụng Strategy Pattern khi nào? 22
TỔNG KẾT 23
TÀI LIỆU THAM KHẢO 24
MỞ ĐẦU
LỜI MỞ ĐẦU
Ngày nay, công nghệ thông tin được coi ngành quyền lực bậc nhất với hàng
loạt ứng dụng trong mọi lĩnh vực của đời sống - từ sản xuất, kinh doanh đến giáo dục,
y tế, văn hóa... Đặc biệt, thời kCách mạng 4.0 - tại Việt Nam bản ứng
dụng như công nghệ tự động hóa, trao đổi dữ liệu. Trong công nghệ sản xuất, công
nghệ thông tin càng khẳng định được tầm quan trọng của mình - vừa là nền tảng, vừa
là động lực để bắt kịp đà phát triển của thế giới.
Vậy để hệ thống tính tái sử dụng cao, tăng tính đóng gói, không lặp lại cũng
như phạm vi logic được thu hẹp thì áp dụng Design Pattern trong phát triển phần
mềm là một sự lựa chọn thích hợp.
Với mong muốn được tìm hiểu sâu về việc phát triển phần mềm nên em đã chọn
đề tài “Desgin Pattern trong Java” Trong quá trình thực hiện đồ án, do còn hạn chế
về thời gian, kinh nghiệm thực tế và dịch bệnh COVID, nhóm chúng em mong nhận
được những góp ý chân thành từ thầy và các bạn.
Đề tài giới thiệu về những thuyết bản của Design Pattern, phân tích đánh giá
các kỹ thuật và xây dựng ứng dụng thực nghiệm.
lOMoARcPSD|36625228
KẾ HOẠCH THỰC HIỆN
8
Tìm hiểu Visitor
02
/05/
20
22
05
/05/
20
22
9
Tìm hiểu Strategy
06
/05/
20
22
10
/05/
20
22
1
0
Xây dựng project minh
họa
16
/05/
20
22
21
/05/
20
22
1
1
Hoàn tất project và báo
cáo
22
/
5/202
2
22
/
5/202
2
lOMoARcPSD|36625228
2. BỐ CỤC BÀI BÁO CÁO
Đồ án được tổ chức làm 6 phần như sau:
- Mở đầu: Trình y do chọn đề tài, mục tiêu nghiên cứu đồ án kế hoạch
thực hiện và bố cục của đồ án.
- Chương 1: Kiến thức cơ bản. Chương y trình bày các khái niệm bản, đặc
điểm, phân loại, ưu và nhược điểm của Design Pattern.
- Chương 2: Các kỹ thuật của Design Pattern. Chương y trình y chi tiết về
các kỹ thuật cũng như cách xây dựng mẫu trong thiết kế phần mềm.
- Chương 3: Project minh họa. Chương này trình bày chủ yếu về phân tích thiết
kế hệ thống hướng đối tượng và áp dụng Design Pattern vào bài toán.
- Tổng kết: Phần y đưa ra những kết quả đồ án đạt được, những thiếu sót chưa
thực hiện được và hướng phát triển đề tài trong tương lai.
- i liệu tham khảo: Phần này đưa ra những đường dẫn website sách tham
khảo mà nhóm đã xem và áp dụng vào bài báo cáo.
.Phân công nhiệm vụ
1.2
T
T
Tên sinh viên
Mô tả công việc
Đóng
góp
1
-
Lập kế hoạch thực hiện, phân chia công
việc các thành viên trong nhóm, và lên ý
tưởng Project.
-
Phụ trách tìm hiểu Builder,
Adapter, Composite, Command.
-
Phụ trách tổng hợp nội dung, code và
làm báo cáo
%
2
-
Phụ trách tìm hiểu SOLID,
Façade, Memento, Visitor,
Stratergy.
Phụ trách xây dựng Project.
-
-
Phụ trách báo cáo phần thực hiện.
%
lOMoARcPSD|36625228
SOLID principle in C++
S -Single responsibility principle ( Nguyên tắc trách nhiệm đơn lẻ )
Một class chỉ nên thực hiện một công việc. Nói cho dễ hiểu thì một class chỉ nên thực hiện
một công việc, thay vì thực hiện nhiều việc trong một class thì chúng ta có thể cho mỗi
class thực hiện một công việc. Ví dụ :
Với việc chia nhỏ ra ta thấy ta có thể dễ dàng gọi đến lớp tương ứng với từng công việc, nó
cũng dễ hơn khi maintain code và không phải sửa ở lớp chính quá nhiều, các đối tượng đã
được tách biệt hoàn toàn về nhiệm vụ.
Open/closed principle ( Nguyên tắc đóng mở )
Theo nguyên tắc này mỗi khi ta muốn thêm chức năng cho chương trình, chúng ta nên viết
class mới mở rộng class cũ bằng cách kế thừa hoặc sở hữu class cũ chứ không nên sửa đổi
class cũ.
Việc y dẫn đến tình trạng phát sinh nhiều class, nhưng chúng ta sẽ không cần phải test lại
c class cũ nữa, mà chỉ tập trung vào test các class mới, nơi chứa các chức năng mới.
Ví dụ : Khi trang web muốn tăng một số cơ chế nhuận bút mới chúng ta thường sẽ thêm thuộc
tính cho class Blogger
lOMoARcPSD|36625228
Theo cách làm trên hoàn toàn đúng. Tuy nhiên, nếu bạn thiết kế chương trình như thế này thì
thực sự có nhiều điểm không hợp lí lắm, nếu chúng ta lại có thêm 1 kiểu nhuận bút nữa thì
sao, khi đó chúng ta lại phải vào sửa lại hàm để đáp ứng dược nhu cầu mới hay sao? Code
mới lúc đó sẽ ảnh hưởng tới code cũ, như vậy có khả năng là sẽ làm hỏng luôn code cũ,
Rõ ràng là chúng ta nên có một phương pháp an toàn và thân thiện hơn.
thể thy rằng, cách thiết kế y làm cho lớp Blogger trở nên: ĐÓNG với mọi sự thay đổi
bên trong, nhưng luôn MỞ cho sự kế thừa để mở rộng sau này.
L - Liskov substitution principle
Nội dung nguyên tắc này là: Trong một chương trình, các object của class con có thể thay thế
class cha mà không làm thay đổi tính đúng đắn của chương trình.
Ví dụ khi ta muốn viết một chương trình để mô tả các loài chim bay được nhưng chim cánh
cụt không bay được. Vì vậy khi viết đến hàm chim cánh cụt thì khi gọi hàm bay của chim
cánh cụt, ta sẽ quăng NoFlyException.
lOMoARcPSD|36625228
Tuy nhiên, quay laị vòng lặp for ở hàm main, nếu như trong danh sách các con chim đó mà
một con chim cánh cụt thì sao?
Chương trình mình sẽ quăng Exception chương trình của chúng ta đã vi phạm Liskov
substitution principle.
Để có thể giải quyết vấn đề này ta sẽ tách class chim cánh cụt ra một interface riêng.
I - Interface segregation principle ( Nguyên tắc phân tách giao diện )
Nội dung: Nếu Interface quá lớn thì nên tách thành các interface nhỏ hơn, với nhiều mục đích
cụ thể.
Nguyên lý này khá dễ hiểu. Hãy tưởng tượng chúng ta có 1 interface lớn, khoảng 100
methods. Việc implements sẽ khá cực khổ, ngoài ra còn có thể dư thừa vì 1 class không cần
dùng hết 100 method.
Khi tách interface ra thành nhiều interface nhỏ, gồm các method liên quan tới nhau, việc
implement và quản lý sẽ dễ hơn.
Ví dụ : Chúng ta có một interface Animal như sau :
Chúng ta có 2 class Dog và Snake implement interface Animal. Nhưng thật vô lý, Dog thì
làm sao có thể fly(), cũng như Snake không thể nào run() được? Thay vào đó, chúng ta nên
tách thành 3 interface như thế này:
lOMoARcPSD|36625228
D - Dependency inversion principle ( Nguyên tắc đảo ngược phụ
thuộc )
DIP là nguyên tắc cuối cùng cũng là nguyên tắc khó hiểu nhất trong SOLID. Nội dung nguyên
tắc này các module cấp cao không nên phthuộc vào các modules cấp thấp. Cả 2 nên phụ
thuộc vào abstraction.
Interface (abstraction) không nên phụ thuộc vào chi tiết, mà ngược lại (Các class giao tiếp với
nhau thông qua interface, không phải thông qua implementation.)
Ví dụ: Khi ta thiết kế một chương trình gửi thông báo từ email đến user
Nhưng bây giờ khách hàng muốn gửi cả SMS và Email đến cho user, bạn phải làm sao?
Tạo một lớp SMSSender chỉnh sửa class Notificaiton. Như vậy bạn vi phạm một c hai
nguyên tắc, Dependency Inversion về sự đảo ngược phụ thuộc Open close principle.
Software đóng cho việc thay đổi nhưng mở cho việc mở rộng.
lOMoARcPSD|36625228
Để thỏa mãn hai nguyên tắc trên, bạn phải Refactoring code theo chiều hướng giảm sự phụ
thuộc cứng bằng cách tạo ra một interface ISender dùng chung giữa hai class EmailSender và
SMSSender.
Giờ đây class Notification phụ thuộc mềm vào interface ISender, nếu khách hàng yêu cầu thêm
một phương thức để chuyển tin nhắn ta thể thêm vào dễ dàng bằng cách sử dụng interface
ISender.
Builder Method Pattern
Builder Method Pattern là gì?
Builder pattern là loại design pattern thuộc loại Creational Pattern, mô hình này cung cấp một
trong những cách tốt nhất để tạo ra một đối tượng.
Builder Pattern là mẫu thiết kế đối tượng được tạo ra để xây dựng một đôi tượng phức tạp
bằng cách sử dụng các đối tượng đơn giản và sử dụng tiếp cận từng bước, việc xây dựng các
đối tượng đôc lập với các đối tương khác.
Sử dụng Builder Pattern khi nào?
Builder Pattern được sử dụng khi:
Khi muốn thay đổi thiết kế cho việc lồng nhau của các hàm khởi tạo (Telescoping
Constructor Pattern). Vấn đề này phát sinh khi lập trình viên làm việc với một lớp mà có
chứa rất nhiều các thuộc tính và cần phải tạo ra nhiều hàm khởi tạo với số lượng các
thuộc tính tăng dần.
lOMoARcPSD|36625228
Khi cần tạo ra một đối tượng phức tạp, một đối tượng thuật toán để tạo tạo lập các thuộc
tính là độc lập đối với các thuộc tính khác.
Lợi ích của Builder Pattern là gì?
Lợi ích của Builder Pattern:
Hỗ trợ, loại bớt iệ phải iết nhiều onѕtru tor.Code dễ đọ , dễ bảo trì hơn khi ѕố
lượng thuộ tính (properу) bắt buộ để tạo một obje t từ 4 ho 5
properу.
Giảm bớt ѕố lượng onѕtru tor, không ần truуền giá trị null ho á tham ѕố không ѕử
dụng.
Ít bị lỗi do iệ gán ѕai tham ѕố khi mà ó nhiều tham ѕố trong onѕtru tor:
Bởi ì người dùng đã biết đượ hính хá giá trị gì khi gọi phương thứơng ứng.ᴄᴄ
Đối tượng đượ хâу dựng an toàn hơn: Bởi ì đã đư tạo hoàn hỉnh trư khi ѕử
dụng.
Cung ấp ho bạn kiểm ѕoát tốt hơn quá trình хâу dựng: Chúng ta ó thể thêm
хử lý kiểm tra ràng buộ trướ khi đối tượng đượ trả ề người dùng.
thể tạo đối tượng immutable.
Adapter Pattern
Adapter Pattern là gì?
Adapter patternmột mẫu thiết kế phần mềm, Adapter Pattern nằm trong nhóm Cấu trúc
Structural Pattern liên quan đến cấu trúc cho toàn hệ thống, tập trung vào các mối quan hệ
giữa các thực thể, các component, làm cho chúng tương tác dễ dàng với nhau hơn. Adapter
Pattern đóng vai trò trung gian, tương thích cho hệ thống sẵn đối ứng với các component
mới mà không cần phải sửa đổi code, cho phép các interface không liên quan đến nhau có thể
làm việc cùng nhau.
Lợi ích của Adapter Pattern là gì?
lOMoARcPSD|36625228
Sử dụng cho dự án một lớp riêng không đụng tới những code cũ, hay còn gọi là code gốc
Tăng tính minh bạch và khả năng tái sử dụng của lớp, đóng gói việc triển khai, khả năng
tái sử dụng rất cao.
Tính sẵn sàng luôn có. Tính linh hoạt và khả năng mở rộng rất tốt.
Thông qua việc sử dụng các tệp cấu hình, Adapter pattern có thể dễ dàng được thay thế và có
thể thêm các lớp Adapter mà không cần sửa đổi gốc, tuân theo nguyên tắc mở đóng
trong lập trình.
Sử dụng Adapter Pattern khi nào?
Trường hợp sử dụng nhiều nhất lẽ sử dụng nâng cấp một hệ thống mới không
muốn đụng vào mô hình của các thế hệ trước kia.
Tình huống được sử dụng tiếp theo đó sử dụng third party, nhưng developer sẽ định nghĩa
lại những interface do chính dự án yêu cầu. Xem thêm: third party gì? Khi nào sử dụng third
party.
Composite pattern
Composite Pattern là gì?
Composite một mẫu thiết kế thuộc nhóm Structural Pattern. Composite Pattern một s
tổng hợp những thành phần có quan hệ với nhau để tạo ra thành phần lớn hơn.
Nó cho phép thực hiện các tương tác với tất cả đối tượng trong mẫu tương tự nhau.
lOMoARcPSD|36625228
Composite Pattern bao gồm các thành phần:
Component protocol: Đảm bảo tất cả c thành phần trong cây phải được xử theo
cùng 1 hướng.
Leaf: Là một thành phần trong cây nhưng không có thành phần con.
Composite: một container chứa các đối tượng leaf các composite khác. Tất cả c
nút composite leaf đều xuất phát từ component protocol. Chúng ta thể tổ chức
một vài lớp leaf khác nhau trong đối tượng composite.
Lợi ích của Composite Pattern là gì?
Cung cấp cùng một cách sử dụng đối với từng đối tượng riêng lẻ hoặc nhóm các đối tượng với
nhau.
Sử dụng Composite Pattern khi nào?
Composite Pattern chỉ nên được áp dụng khi nhóm đối tượng phải hoạt động như một
đối tượng duy nhất (theo cùng một cách).
Composite Pattern có thể được sử dụng để tạo ra một cấu trúc giống như cấu trúc cây.
lOMoARcPSD|36625228
Facade pattern
Facade Pattern là gì?
Facade là một mẫu thiết kế thuộc nhóm cấu trúc (Structural Pattern). Facade là một đối tượng
và đối tượng này cung cấp một interface đơn giản để che giấu đi các xử lý phức tạp bên trong
nó.
Lợi ích của Facade Pattern là gì?
Ta có thể tách mã nguồn của mình ra khỏi sự phức tạp của hệ thống con
Hệ thống tích hợp thông qua Facade sẽ đơn giản hơn vì chỉ cần tương tác với Facade thay vì
hàng loạt đối tượng khác.
Tăng khả năng độc lập và khả chuyển, giảm sự phụ thuộc.
Có thể đóng gói nhiều hàm được thiết kế không tốt bằng 1 hàm có thiết kế tốt hơn.
Sử dụng Facade Pattern khi nào?
Dưới đây chúng ta có thể liệt một số trường hợp khi gặp sẽ phải cân nhắc sử dụng Facade
pattern:
Muốn gom nhóm chức năng lại để Client dễ sử dụng. Khi hệ thống rất nhiều lớp làm người
sử dụng rất khó để có thể hiểu được quy trình xử lý của chương trình.khi có rất nhiều hệ
thống con mỗi hệ thống con đó lại có những giao diện riêng lẻ củanên rất khó cho việc
sử dụng phối hợp. Khi đó có thể sử dụng Facade Pattern để tạo ra một giao diện đơn giản cho
người sử dụng một hệ thống phức tạp.
Giảm sự phụ thuộc. Khi bạn muốn phân lớp các hệ thống con. Dùng Façade Pattern để
địnhnghĩa cổng giao tiếp chung cho mỗi hệ thống con, do đó giúp giảm sự phụ thuộc của các
hệ thống con các hệ thống này chỉ giao tiếp với nhau thông qua các cổng giao diện chung
đó.
Tăng khả năng độc lập và khả chuyển
Khi người sử dụng phụ thuộc nhiều vào các lớp cài đặt. Việc áp dụng Façade Pattern sẽ tách
biệt hệ thống con của người dùng các hệ thống con khác, do đó ng khả năng độc lập
khả chuyển của hệ thống con, dễ chuyển đổi nâng cấp trong tương lai.
lOMoARcPSD|36625228
Đóng gói nhiều chức năng, che giấu thuật toán phức tạp.
Cần một interface không rắc rối mà dễ sử dụng.
Command pattern
Command pattern là gì?
Command Pattern một trong 23 design pattern Gang of Four nổi tiếng. Command pattern thuộc
nhóm các pattern hành vi: Đóng gói tất cả thông tin cần thiết vào 1 đối tượng để thực hiện hành
động hay kích hoạt một sự kiện thực hiện sau đó.
Các thông tin thể bao gồm tên phương thức, các biến giá trị cần thiết...hay đơn giản hơn đó
cho phép chuyển yêu cầu thành đối tượng độc lập, thể được sử dụng để tham số hóa các
đối tượng với các yêu cầu khác nhau như log, queue (undo/redo), transtraction. ới đây là các
thành phần cần có của 1 command pattern
Trong đó:
Command : là một interface hoặc abstract class, chứa một phương thức trừu tượng thực
thi (execute) một hành động (operation). Request sẽ được đóng gói dưới dạng
Command.
ConcreteCommand : là các implementation của Command. Định nghĩa một sự gắn kết
giữa một đối tượng Receiver một hành động. Thực thi execute() bằng việc gọi
operation đang hoãn trên Receiver. Mỗi một ConcreteCommand sẽ phục vụ cho một
case request riêng.
Client : tiếp nhận request từ phía người dùng, đóng gói request thành
ConcreteCommand thích hợp và thiết lập receiver của nó.
Invoker : tiếp nhận ConcreteCommand từ Client gọi execute() của
ConcreteCommand để thực thi request.
lOMoARcPSD|36625228
Receiver : đây thành phần thực sự xử business logic cho case request. Trong
phương thức execute() của ConcreteCommand chúng ta sẽ gọi method thích hợp trong
Receiver.
Lợi ích của Command Pattern là gì?
Dễ dàng thêm các Command mới trong hệ thống mà không cần thay đổi trong các lớp
hiện có. Đảm bảo Open/Closed Principle.
Tách đối tượng gọi operation từ đối tượng thực sự thực hiện operation. Giảm kết nối
giữa Invoker và Receiver.
Cho phép tham số hóa các yêu cầu khác nhau bằng một hành động để thực hiện.
Cho phép lưu các yêu cầu trong hàng đợi. Đóng gói một yêu cầu trong một đối tượng.
Dễ dàng chuyển dữ liệu dưới dạng đối tượng giữa các thành phần hệ thống.
Sử dụng Command Pattern khi nào?
Khi cần tham số hóa các đối tượng theo một hành động thực hiện.
Khi cần tạo và thực thi các yêu cầu vào các thời điểm khác nhau.
Khi cần hỗ trợ tính năng undo, log , callback hoặc transaction.
Memento Pattern
Memento Pattern là gì?
Memento một Design Pattern thuộc loại Behavior. cho phép chúng ta lưu trữ khôi
phục trạng thái của một đối tượngkhông tiết lộ chi tiết bên trong của nó. Memento Pattern
gồm các thành phần chính như sau:
Originator: là Object có trạng thái được lưu trữ hoặc khôi phục.
Mementor: là trạng thái (State) của Object khi đang được lưu trữ.
CareTaker: đóng vai trò lưu trữ và cấp phát các Memento.
lOMoARcPSD|36625228
Lợi ích của Memento Pattern là gì?
Bảo bảo nguyên tắc đóng gói: sử dụng trực tiếp trạng thái của đối tượng thể làm lộ thông
tin chi tiết bên trong đối tượng và vi phạm nguyên tắc đóng gói.
Đơn giản code của Originator bằng cách để Memento lưu giữ trạng thái của Originator
Caretaker quản lý lịch sử thay đổi của Originator.
Sử dụng Memento khi nào?
Memento Pattern được sử dụng bất cứ khi nào chúng ta muốn u sau đó khôi phục trạng
thái của một Object.
Ví dụ như khi chúng ta chơi game, chúng ta muốn lưu lại tất cả những trạng thái chúng ta đã
chơi trước đó để sau khi quit game và mở lại thì chúng ta có thể tiếp tục chơi, khi đó ta có th
áp dụng Memento Pattern để giải quyết bài toán này.
Visitor Pattern
Visitor Pattern là gì?
Visitor Pattern một trong những Pattern thuộc nhóm hành vi (Behavior Pattern). 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 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.
Lợi ích của Visitor Pattern là gì?
Cho phép một hoặc nhiều hành vi được áp dụng cho một tập hợp các đối tượng tại thời điểm
run-time, tách rời các hành vi khỏi cấu trúc đối tượng.
Đảm bảo nguyên tắc Open/ Close: đối tượng gốc không bị thay đổi, dễ dàng thêm hành vi mới
cho đối tượng thông qua visitor.
Sử dụng Visitor Pattern khi nào?
Khi có một cấu trúc đối tượng phức tạp với nhiều class và interface. Người dùng cần thực hiện một
số hành vi cụ thể của riêng đối tượng, tùy thuộc vào concrete class của chúng.
lOMoARcPSD|36625228
Khi chúng ta phải thực hiện một thao tác trên một nhóm các loại đối tượng tương tự. Chúng ta có
thể di chuyển logic hành vi từ các đối tượng sang một lớp khác.
Khi cấu trúc dữ liệu của đối tượng ít khi thay đổi nhưng hành vi của chúng được thay đổi thường
xuyên.
Khi muốn tránh sử dụng toán tử instanceof.
Strategy Pattern
Strategy Pattern là gì?
Strategy pattern (mẫu chiến lược): Hiểu một cách đơn giản thì đây là mẫu thiết kế giúp bạn
trừu tượng hóa những hành vi (behavior, method, function) của một đối tượng bằng cách đưa
ra những cài đặt vào những lớp khác nhau.
Lợi ích của Strategy Pattern là gì?
Nó cung cấp một sự thay thế cho các class con.
Nó định nghĩa mỗi hành vi trong lớp riêng, loại bỏ sự cần thiết cho các câu lệnh có điều kiện.
Nó giúp dễ dàng mở rộng và kết hợp hành vi mới mà không thay đổi ứng dụng.
Sử dụng Strategy Pattern khi nào?
Khi nhiều lớp chỉ khác nhau về hành vi.
Khi bạn cần các biến thể khác nhau của thuật toán.
TỔNG KẾT
Design Pattern là một vấn đề hết sức quan trọng đối với các tổ chức phát triển
phần mềm hiện nay. Trong quá trình thực hiện đồ án do thời gian nghiên cứu và kinh
nghiệm bản thân còn hạn chế nên một số phần của đồ án nghiên cứu chưa được sâu.
Sau 03 tháng thực hiện nghiên cứu đề tài, dưới sự ớng dẫn tận tình của Tiến sỹ Huỳnh
Xuân Phụng, đồ án của em đã đạt được những kết quả sau:
Kết quả đạt được:
Tìm hiểu và nghiên cứu cơ sở lý thuyết của Design Pattern
Nắm được một số kỹ thuật hay sử dụng và cách sử dụng
Biết áp dụng Design Pattern vào bài toán đơn giản Hạn
chế:
lOMoARcPSD|36625228
Trong thời gian qua, chúng em đã cố gắng hết sức để m hiểu thực hiện đề tài.
Tuy nhiên với kinh nghiệm và thời gian hạn chế nên không thể tránh khỏi những thiếu
sót trong đồ án. Cụ thể:
Chưa nghiên cứu sâu vào các kỹ thuật của Design Patterns
Đồ án mới tập trung vào một bài toán nhnên vẫn chưa toát nên được tầm
quan trọng của Design Patterns
Trình bày thiếu logic, cách diễn đạt còn kém
Hướng phát triển của đề tài trong tương lai:
Với mong muốn trở thành lập trình viên phần mềm trong tương lai nên trong thời
gian tới em sẽ tiếp tục tìm hiểu và nghiên cứu cũng như hoàn thiện đồ án của mình ở
mức cao nhất. sau đó sẽ nghiên cứu áp dụng Design Patterns o bài toán Quản
mầm non để thấy được tầm quan trọng của nó. Rồi từ đó rút ra kinh nghiệm của
bản thân và cải thiện các kỹ năng cần thiết.
TÀI LIỆU THAM KHẢO
[1]. https://shorturl.at/tADFK
[2]. https://tuanitpro.com/design-pattern-la-gi
[3]. https://blog.duyet.net/2015/02/oop-design-patterns-la-gi
[4]. https://refactoring.guru/design-patterns/catalog
[5]. https://developer.ibm.com/languages/java/
[6]. https://www.journaldev.com/1827/java-design-patterns-example-tutorial
| 1/20

Preview text:

lOMoARcPSD| 36625228
TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP.HCM
KHOA CÔNG NGHỆ THÔNG TIN BÁO CÁO CUỐI KÌ
TÌM HIỂU VỀ DESIGN PATTERN TRONG C++ lOMoARcPSD| 36625228
ĐỒ ÁN MÔN HỌC MẪU THIẾT KẾ PHẦN MỀM
HỌC KÌ II, NĂM HỌC 2022 – 2023
- Tên đề tài: TÌM HIỂU VỀ DESIGN PATTERN TRONG C++
- Thời gian thực hiện: Từ: 26/03/2022 Đến: 5/6/2022
- Giáo viên hướng dẫn: TS. Huỳnh Xuân Phụng -
Yêu cầu của đề tài:
1. SOLID Design principle in C++ 2. Pattern: ▪ Builder ▪ Adapter ▪ Composite ▪ Facade ▪ Command ▪ Memento ▪ Visitor ▪ Strategy 3. Project minh họa
- Lớp: 212DEPA330879_04CLC -
Sinh viên thực hiện : ST HỌ TÊN MSSV THAM GIA T TÊN ( % ) 1 100 % 2 100 % Ghi chú: Tỷ lệ % = 100% NHẬN XÉT ĐIỂM SỐ TIÊU NỘI DUNG TRÌNH BÀY TỔNG CHÍ ĐIỂM lOMoARcPSD| 36625228 Mục Lục LỜI CẢM ƠN 1
ĐỒ ÁN MÔN HỌC MẪU THIẾT KẾ PHẦN MỀM 2 NHẬN XÉT 3 MỞ ĐẦU 5 SOLID principle in C++ 10
S -Single responsibility principle ( Nguyên tắc trách nhiệm đơn lẻ ) 10
Open/closed principle ( Nguyên tắc đóng mở ) 10
L - Liskov substitution principle 11
I - Interface segregation principle ( Nguyên tắc phân tách giao diện ) 12
D - Dependency inversion principle ( Nguyên tắc đảo ngược phụ thuộc ) 13 Builder Method Pattern 14
Builder Method Pattern là gì? 14
Sử dụng Builder Pattern khi nào? 14
Lợi ích của Builder Pattern là gì? 15 Adapter Pattern 15
Adapter Pattern là gì? 15
Lợi ích của Adapter Pattern là gì? 16
Sử dụng Adapter Pattern khi nào? 16 Composite pattern 16
Composite Pattern là gì? 16
Lợi ích của Composite Pattern là gì? 17
Sử dụng Composite Pattern khi nào? 17 Facade pattern 17
Facade Pattern là gì? 18
Lợi ích của Facade Pattern là gì? 18
Sử dụng Facade Pattern khi nào? 18 Command pattern 19
Command pattern là gì? 19
Lợi ích của Command Pattern là gì? 20
Sử dụng Command Pattern khi nào? 20 lOMoARcPSD| 36625228 Memento Pattern 20
Memento Pattern là gì? 20
Lợi ích của Memento Pattern là gì? 21
Sử dụng Memento khi nào? 21 Visitor Pattern 21
Visitor Pattern là gì? 21
Lợi ích của Visitor Pattern là gì? 21
Sử dụng Visitor Pattern khi nào? 21 Strategy Pattern 22
Strategy Pattern là gì? 22
Lợi ích của Strategy Pattern là gì? 22
Sử dụng Strategy Pattern khi nào? 22 TỔNG KẾT 23
TÀI LIỆU THAM KHẢO 24 MỞ ĐẦU LỜI MỞ ĐẦU
Ngày nay, công nghệ thông tin được coi là ngành quyền lực bậc nhất với hàng
loạt ứng dụng trong mọi lĩnh vực của đời sống - từ sản xuất, kinh doanh đến giáo dục,
y tế, văn hóa... Đặc biệt, ở thời kỳ Cách mạng 4.0 - mà tại Việt Nam cơ bản là ứng
dụng như công nghệ tự động hóa, trao đổi dữ liệu. Trong công nghệ sản xuất, công
nghệ thông tin càng khẳng định được tầm quan trọng của mình - vừa là nền tảng, vừa
là động lực để bắt kịp đà phát triển của thế giới.
Vậy để hệ thống có tính tái sử dụng cao, tăng tính đóng gói, không lặp lại cũng
như phạm vi logic được thu hẹp thì áp dụng Design Pattern trong phát triển phần
mềm là một sự lựa chọn thích hợp.
Với mong muốn được tìm hiểu sâu về việc phát triển phần mềm nên em đã chọn
đề tài “Desgin Pattern trong Java” Trong quá trình thực hiện đồ án, do còn hạn chế
về thời gian, kinh nghiệm thực tế và dịch bệnh COVID, nhóm chúng em mong nhận
được những góp ý chân thành từ thầy và các bạn.
Đề tài giới thiệu về những lý thuyết cơ bản của Design Pattern, phân tích đánh giá
các kỹ thuật và xây dựng ứng dụng thực nghiệm. lOMoARcPSD| 36625228
KẾ HOẠCH THỰC HIỆN 8 Tìm hiểu Visitor 02 /05/ 20 05 /05/ 20 22 22 9 Tìm hiểu Strategy 06 /05/ 20 10 /05/ 20 22 22 1 Xây dựng project minh 16 /05/ 20 21 /05/ 20 0 họa 22 22 1 Hoàn tất project và báo 22 / 5/202 22 / 5/202 1 cáo 2 2 lOMoARcPSD| 36625228 .Phân cô 1.2 ng nhiệm vụ T Tên sinh viên Mô tả công việc Đóng T góp
- Lập kế hoạch thực hiện, phân chia công
việc các thành viên trong nhóm, và lên ý tưởng Project. 1
- Phụ trách tìm hiểu Builder, 100 % Adapter, Composite, Command.
- Phụ trách tổng hợp nội dung, code và làm báo cáo
- Phụ trách tìm hiểu SOLID, Façade, Memento, Visitor, 2 100 Stratergy. %
- Phụ trách xây dựng Project.
- Phụ trách báo cáo phần thực hiện.
2. BỐ CỤC BÀI BÁO CÁO
Đồ án được tổ chức làm 6 phần như sau:
- Mở đầu: Trình bày rõ lý do chọn đề tài, mục tiêu nghiên cứu đồ án kế hoạch
thực hiện và bố cục của đồ án.
- Chương 1: Kiến thức cơ bản. Chương này trình bày các khái niệm cơ bản, đặc
điểm, phân loại, ưu và nhược điểm của Design Pattern.
- Chương 2: Các kỹ thuật của Design Pattern. Chương này trình bày chi tiết về
các kỹ thuật cũng như cách xây dựng mẫu trong thiết kế phần mềm.
- Chương 3: Project minh họa. Chương này trình bày chủ yếu về phân tích thiết
kế hệ thống hướng đối tượng và áp dụng Design Pattern vào bài toán.
- Tổng kết: Phần này đưa ra những kết quả đồ án đạt được, những thiếu sót chưa
thực hiện được và hướng phát triển đề tài trong tương lai.
- Tài liệu tham khảo: Phần này đưa ra những đường dẫn website và sách tham
khảo mà nhóm đã xem và áp dụng vào bài báo cáo. lOMoARcPSD| 36625228 SOLID principle in C++
S -Single responsibility principle ( Nguyên tắc trách nhiệm đơn lẻ )
Một class chỉ nên thực hiện một công việc. Nói cho dễ hiểu thì một class chỉ nên thực hiện
một công việc, thay vì thực hiện nhiều việc trong một class thì chúng ta có thể cho mỗi
class thực hiện một công việc. Ví dụ :
Với việc chia nhỏ ra ta thấy ta có thể dễ dàng gọi đến lớp tương ứng với từng công việc, nó
cũng dễ hơn khi maintain code và không phải sửa ở lớp chính quá nhiều, các đối tượng đã
được tách biệt hoàn toàn về nhiệm vụ.
Open/closed principle ( Nguyên tắc đóng mở )
Theo nguyên tắc này mỗi khi ta muốn thêm chức năng cho chương trình, chúng ta nên viết
class mới mở rộng class cũ bằng cách kế thừa hoặc sở hữu class cũ chứ không nên sửa đổi class cũ.
Việc này dẫn đến tình trạng phát sinh nhiều class, nhưng chúng ta sẽ không cần phải test lại
các class cũ nữa, mà chỉ tập trung vào test các class mới, nơi chứa các chức năng mới.
Ví dụ : Khi trang web muốn tăng một số cơ chế nhuận bút mới chúng ta thường sẽ thêm thuộc tính cho class Blogger lOMoARcPSD| 36625228
Theo cách làm trên hoàn toàn đúng. Tuy nhiên, nếu bạn thiết kế chương trình như thế này thì
thực sự có nhiều điểm không hợp lí lắm, nếu chúng ta lại có thêm 1 kiểu nhuận bút nữa thì
sao, khi đó chúng ta lại phải vào sửa lại hàm để đáp ứng dược nhu cầu mới hay sao? Code
mới lúc đó sẽ ảnh hưởng tới code cũ, như vậy có khả năng là sẽ làm hỏng luôn code cũ, …
Rõ ràng là chúng ta nên có một phương pháp an toàn và thân thiện hơn.
Có thể thấy rằng, cách thiết kế này làm cho lớp Blogger trở nên: ĐÓNG với mọi sự thay đổi
bên trong, nhưng luôn MỞ cho sự kế thừa để mở rộng sau này.
L - Liskov substitution principle
Nội dung nguyên tắc này là: Trong một chương trình, các object của class con có thể thay thế
class cha mà không làm thay đổi tính đúng đắn của chương trình.
Ví dụ khi ta muốn viết một chương trình để mô tả các loài chim bay được nhưng chim cánh
cụt không bay được. Vì vậy khi viết đến hàm chim cánh cụt thì khi gọi hàm bay của chim
cánh cụt, ta sẽ quăng NoFlyException. lOMoARcPSD| 36625228
Tuy nhiên, quay laị vòng lặp for ở hàm main, nếu như trong danh sách các con chim đó mà có
một con chim cánh cụt thì sao?
Chương trình mình sẽ quăng Exception vì chương trình của chúng ta đã vi phạm Liskov substitution principle.
Để có thể giải quyết vấn đề này ta sẽ tách class chim cánh cụt ra một interface riêng.
I - Interface segregation principle ( Nguyên tắc phân tách giao diện )
Nội dung: Nếu Interface quá lớn thì nên tách thành các interface nhỏ hơn, với nhiều mục đích cụ thể.
Nguyên lý này khá dễ hiểu. Hãy tưởng tượng chúng ta có 1 interface lớn, khoảng 100
methods. Việc implements sẽ khá cực khổ, ngoài ra còn có thể dư thừa vì 1 class không cần dùng hết 100 method.
Khi tách interface ra thành nhiều interface nhỏ, gồm các method liên quan tới nhau, việc
implement và quản lý sẽ dễ hơn.
Ví dụ : Chúng ta có một interface Animal như sau :
Chúng ta có 2 class Dog và Snake implement interface Animal. Nhưng thật vô lý, Dog thì
làm sao có thể fly(), cũng như Snake không thể nào run() được? Thay vào đó, chúng ta nên
tách thành 3 interface như thế này: lOMoARcPSD| 36625228
D - Dependency inversion principle ( Nguyên tắc đảo ngược phụ thuộc )
DIP là nguyên tắc cuối cùng cũng là nguyên tắc khó hiểu nhất trong SOLID. Nội dung nguyên
tắc này là các module cấp cao không nên phụ thuộc vào các modules cấp thấp. Cả 2 nên phụ thuộc vào abstraction.
Interface (abstraction) không nên phụ thuộc vào chi tiết, mà ngược lại (Các class giao tiếp với
nhau thông qua interface, không phải thông qua implementation.)
Ví dụ: Khi ta thiết kế một chương trình gửi thông báo từ email đến user
Nhưng bây giờ khách hàng muốn gửi cả SMS và Email đến cho user, bạn phải làm sao?
Tạo một lớp SMSSender và chỉnh sửa class Notificaiton. Như vậy bạn vi phạm một lúc hai
nguyên tắc, Dependency Inversion về sự đảo ngược phụ thuộc và Open close principle.
Software đóng cho việc thay đổi nhưng mở cho việc mở rộng. lOMoARcPSD| 36625228
Để thỏa mãn hai nguyên tắc trên, bạn phải Refactoring code theo chiều hướng giảm sự phụ
thuộc cứng bằng cách tạo ra một interface ISender dùng chung giữa hai class EmailSender và SMSSender.
Giờ đây class Notification phụ thuộc mềm vào interface ISender, nếu khách hàng yêu cầu thêm
một phương thức để chuyển tin nhắn ta có thể thêm vào dễ dàng bằng cách sử dụng interface ISender. Builder Method Pattern
Builder Method Pattern là gì?
Builder pattern là loại design pattern thuộc loại Creational Pattern, mô hình này cung cấp một
trong những cách tốt nhất để tạo ra một đối tượng.
Builder Pattern là mẫu thiết kế đối tượng được tạo ra để xây dựng một đôi tượng phức tạp
bằng cách sử dụng các đối tượng đơn giản và sử dụng tiếp cận từng bước, việc xây dựng các
đối tượng đôc lập với các đối tương khác.
Sử dụng Builder Pattern khi nào?
Builder Pattern được sử dụng khi:
Khi muốn thay đổi thiết kế cho việc lồng nhau của các hàm khởi tạo (Telescoping
Constructor Pattern). Vấn đề này phát sinh khi lập trình viên làm việc với một lớp mà có
chứa rất nhiều các thuộc tính và cần phải tạo ra nhiều hàm khởi tạo với số lượng các thuộc tính tăng dần. lOMoARcPSD| 36625228
Khi cần tạo ra một đối tượng phức tạp, một đối tượng mà thuật toán để tạo tạo lập các thuộc
tính là độc lập đối với các thuộc tính khác.
Lợi ích của Builder Pattern là gì?
Lợi ích của Builder Pattern:
Hỗ trợ, loại bớt iệ phải iết nhiều onѕtru tor.Code dễ đọ , dễ bảo trì hơn khi ѕố ᴠ ᴄ ᴠ ᴄ ᴄ
ᴄ lượng thuộ tính (properу) bắt buộ để tạo một obje t từ 4 hoặ 5 properу.ᴄ ᴄ ᴄ ᴄ
Giảm bớt ѕố lượng onѕtru tor, không ần truуền giá trị null ho á tham ѕố không ѕử ᴄ ᴄ ᴄ ᴄ ᴄ ᴄ dụng.
Ít bị lỗi do iệ gán ѕai tham ѕố khi mà ó nhiều tham ѕố trong onѕtru tor: ᴠ ᴄ ᴄ ᴄ
ᴄ Bởi ì ngườiᴠ dùng đã biết đượ hính хá giá trị gì khi gọi phương thứ tương ứng.ᴄᴄ ᴄ ᴄ
Đối tượng đượ хâу dựng an toàn hơn: ᴄ Bởi ì nó đã đượ tạo hoàn hỉnh trướ khi ѕử ᴠ ᴄ ᴄ ᴄ dụng.
Cung ấp ho bạn kiểm ѕoát tốt hơn quá trình хâу dựng: ᴄ ᴄ Chúng ta ó thể thêm
хử lý ᴄ kiểm tra ràng buộ trướ khi đối tượng đượ trả ề người dùng.ᴄ ᴄ ᴄ ᴠ Có
thể tạo đối tượng immutable. Adapter Pattern
Adapter Pattern là gì?
Adapter pattern là một mẫu thiết kế phần mềm, Adapter Pattern nằm trong nhóm Cấu trúc —
Structural Pattern — liên quan đến cấu trúc cho toàn hệ thống, tập trung vào các mối quan hệ
giữa các thực thể, các component, làm cho chúng tương tác dễ dàng với nhau hơn. Adapter
Pattern đóng vai trò trung gian, tương thích cho hệ thống sẵn có đối ứng với các component
mới mà không cần phải sửa đổi code, cho phép các interface không liên quan đến nhau có thể làm việc cùng nhau.
Lợi ích của Adapter Pattern là gì? lOMoARcPSD| 36625228
● Sử dụng cho dự án một lớp riêng mà không đụng tới những code cũ, hay còn gọi là code gốc
Tăng tính minh bạch và khả năng tái sử dụng của lớp, đóng gói việc triển khai, và khả năng tái sử dụng rất cao.
● Tính sẵn sàng luôn có. Tính linh hoạt và khả năng mở rộng rất tốt.
● Thông qua việc sử dụng các tệp cấu hình, Adapter pattern có thể dễ dàng được thay thế và có
thể thêm các lớp Adapter mà không cần sửa đổi mã gốc, tuân theo nguyên tắc mở và đóng trong lập trình.
Sử dụng Adapter Pattern khi nào?
Trường hợp mà sử dụng nhiều nhất có lẽ là sử dụng và nâng cấp một hệ thống mới và không
muốn đụng vào mô hình của các thế hệ trước kia.
Tình huống được sử dụng tiếp theo đó là sử dụng third party, nhưng developer sẽ định nghĩa
lại những interface do chính dự án yêu cầu. Xem thêm: third party là gì? Khi nào sử dụng third party. Composite pattern
Composite Pattern là gì?
Composite là một mẫu thiết kế thuộc nhóm Structural Pattern. Composite Pattern là một sự
tổng hợp những thành phần có quan hệ với nhau để tạo ra thành phần lớn hơn.
Nó cho phép thực hiện các tương tác với tất cả đối tượng trong mẫu tương tự nhau. lOMoARcPSD| 36625228
Composite Pattern bao gồm các thành phần:
• Component protocol: Đảm bảo tất cả các thành phần trong cây phải được xử lí theo cùng 1 hướng.
• Leaf: Là một thành phần trong cây nhưng không có thành phần con.
• Composite: Là một container chứa các đối tượng leaf và các composite khác. Tất cả các
nút composite và leaf đều xuất phát từ component protocol. Chúng ta có thể tổ chức
một vài lớp leaf khác nhau trong đối tượng composite.
Lợi ích của Composite Pattern là gì?
● Cung cấp cùng một cách sử dụng đối với từng đối tượng riêng lẻ hoặc nhóm các đối tượng với nhau.
Sử dụng Composite Pattern khi nào?
• Composite Pattern chỉ nên được áp dụng khi nhóm đối tượng phải hoạt động như một
đối tượng duy nhất (theo cùng một cách).
• Composite Pattern có thể được sử dụng để tạo ra một cấu trúc giống như cấu trúc cây. lOMoARcPSD| 36625228 Facade pattern
Facade Pattern là gì?
Facade là một mẫu thiết kế thuộc nhóm cấu trúc (Structural Pattern). Facade là một đối tượng
và đối tượng này cung cấp một interface đơn giản để che giấu đi các xử lý phức tạp bên trong nó.
Lợi ích của Facade Pattern là gì?
● Ta có thể tách mã nguồn của mình ra khỏi sự phức tạp của hệ thống con
● Hệ thống tích hợp thông qua Facade sẽ đơn giản hơn vì chỉ cần tương tác với Facade thay vì
hàng loạt đối tượng khác.
● Tăng khả năng độc lập và khả chuyển, giảm sự phụ thuộc.
● Có thể đóng gói nhiều hàm được thiết kế không tốt bằng 1 hàm có thiết kế tốt hơn.
Sử dụng Facade Pattern khi nào?
Dưới đây chúng ta có thể liệt kê một số trường hợp mà khi gặp sẽ phải cân nhắc sử dụng Facade pattern:
● Muốn gom nhóm chức năng lại để Client dễ sử dụng. Khi hệ thống có rất nhiều lớp làm người
sử dụng rất khó để có thể hiểu được quy trình xử lý của chương trình. Và khi có rất nhiều hệ
thống con mà mỗi hệ thống con đó lại có những giao diện riêng lẻ của nó nên rất khó cho việc
sử dụng phối hợp. Khi đó có thể sử dụng Facade Pattern để tạo ra một giao diện đơn giản cho
người sử dụng một hệ thống phức tạp.
● Giảm sự phụ thuộc. Khi bạn muốn phân lớp các hệ thống con. Dùng Façade Pattern để
địnhnghĩa cổng giao tiếp chung cho mỗi hệ thống con, do đó giúp giảm sự phụ thuộc của các
hệ thống con vì các hệ thống này chỉ giao tiếp với nhau thông qua các cổng giao diện chung đó.
● Tăng khả năng độc lập và khả chuyển
● Khi người sử dụng phụ thuộc nhiều vào các lớp cài đặt. Việc áp dụng Façade Pattern sẽ tách
biệt hệ thống con của người dùng và các hệ thống con khác, do đó tăng khả năng độc lập và
khả chuyển của hệ thống con, dễ chuyển đổi nâng cấp trong tương lai. lOMoARcPSD| 36625228
● Đóng gói nhiều chức năng, che giấu thuật toán phức tạp.
● Cần một interface không rắc rối mà dễ sử dụng. Command pattern
Command pattern là gì?
Command Pattern là một trong 23 design pattern Gang of Four nổi tiếng. Command pattern thuộc
nhóm các pattern hành vi: Đóng gói tất cả thông tin cần thiết vào 1 đối tượng để thực hiện hành
động hay kích hoạt một sự kiện thực hiện sau đó.
Các thông tin có thể bao gồm tên phương thức, các biến và giá trị cần thiết...hay đơn giản hơn đó
là nó cho phép chuyển yêu cầu thành đối tượng độc lập, có thể được sử dụng để tham số hóa các
đối tượng với các yêu cầu khác nhau như log, queue (undo/redo), transtraction. Dưới đây là các
thành phần cần có của 1 command pattern Trong đó:
• Command : là một interface hoặc abstract class, chứa một phương thức trừu tượng thực
thi (execute) một hành động (operation). Request sẽ được đóng gói dưới dạng Command.
• ConcreteCommand : là các implementation của Command. Định nghĩa một sự gắn kết
giữa một đối tượng Receiver và một hành động. Thực thi execute() bằng việc gọi
operation đang hoãn trên Receiver. Mỗi một ConcreteCommand sẽ phục vụ cho một case request riêng.
• Client : tiếp nhận request từ phía người dùng, đóng gói request thành
ConcreteCommand thích hợp và thiết lập receiver của nó.
• Invoker : tiếp nhận ConcreteCommand từ Client và gọi execute() của
ConcreteCommand để thực thi request. lOMoARcPSD| 36625228
• Receiver : đây là thành phần thực sự xử lý business logic cho case request. Trong
phương thức execute() của ConcreteCommand chúng ta sẽ gọi method thích hợp trong Receiver.
Lợi ích của Command Pattern là gì?
• Dễ dàng thêm các Command mới trong hệ thống mà không cần thay đổi trong các lớp
hiện có. Đảm bảo Open/Closed Principle.
• Tách đối tượng gọi operation từ đối tượng thực sự thực hiện operation. Giảm kết nối giữa Invoker và Receiver.
• Cho phép tham số hóa các yêu cầu khác nhau bằng một hành động để thực hiện.
• Cho phép lưu các yêu cầu trong hàng đợi. Đóng gói một yêu cầu trong một đối tượng.
Dễ dàng chuyển dữ liệu dưới dạng đối tượng giữa các thành phần hệ thống.
Sử dụng Command Pattern khi nào?
• Khi cần tham số hóa các đối tượng theo một hành động thực hiện.
• Khi cần tạo và thực thi các yêu cầu vào các thời điểm khác nhau.
• Khi cần hỗ trợ tính năng undo, log , callback hoặc transaction. Memento Pattern
Memento Pattern là gì?
Memento là một Design Pattern thuộc loại Behavior. Nó cho phép chúng ta lưu trữ và khôi
phục trạng thái của một đối tượng mà không tiết lộ chi tiết bên trong của nó. Memento Pattern
gồm các thành phần chính như sau:
Originator: là Object có trạng thái được lưu trữ hoặc khôi phục.
Mementor: là trạng thái (State) của Object khi đang được lưu trữ.
CareTaker: đóng vai trò lưu trữ và cấp phát các Memento. lOMoARcPSD| 36625228
Lợi ích của Memento Pattern là gì?
Bảo bảo nguyên tắc đóng gói: sử dụng trực tiếp trạng thái của đối tượng có thể làm lộ thông
tin chi tiết bên trong đối tượng và vi phạm nguyên tắc đóng gói.
Đơn giản code của Originator bằng cách để Memento lưu giữ trạng thái của Originator và
Caretaker quản lý lịch sử thay đổi của Originator.
Sử dụng Memento khi nào?
Memento Pattern được sử dụng bất cứ khi nào chúng ta muốn lưu và sau đó khôi phục trạng thái của một Object.
Ví dụ như khi chúng ta chơi game, chúng ta muốn lưu lại tất cả những trạng thái chúng ta đã
chơi trước đó để sau khi quit game và mở lại thì chúng ta có thể tiếp tục chơi, khi đó ta có thể
áp dụng Memento Pattern để giải quyết bài toán này. Visitor Pattern
Visitor Pattern là gì?
Visitor Pattern là một trong những Pattern thuộc nhóm hành vi (Behavior Pattern). 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.
Lợi ích của Visitor Pattern là gì?
Cho phép một hoặc nhiều hành vi được áp dụng cho một tập hợp các đối tượng tại thời điểm
run-time, tách rời các hành vi khỏi cấu trúc đối tượng.
Đảm bảo nguyên tắc Open/ Close: đối tượng gốc không bị thay đổi, dễ dàng thêm hành vi mới
cho đối tượng thông qua visitor.
Sử dụng Visitor Pattern khi nào?
Khi có một cấu trúc đối tượng phức tạp với nhiều class và interface. Người dùng cần thực hiện một
số hành vi cụ thể của riêng đối tượng, tùy thuộc vào concrete class của chúng. lOMoARcPSD| 36625228
Khi chúng ta phải thực hiện một thao tác trên một nhóm các loại đối tượng tương tự. Chúng ta có
thể di chuyển logic hành vi từ các đối tượng sang một lớp khác.
Khi cấu trúc dữ liệu của đối tượng ít khi thay đổi nhưng hành vi của chúng được thay đổi thường xuyên.
Khi muốn tránh sử dụng toán tử instanceof. Strategy Pattern
Strategy Pattern là gì?
Strategy pattern (mẫu chiến lược): Hiểu một cách đơn giản thì đây là mẫu thiết kế giúp bạn
trừu tượng hóa những hành vi (behavior, method, function) của một đối tượng bằng cách đưa
ra những cài đặt vào những lớp khác nhau.
Lợi ích của Strategy Pattern là gì?
Nó cung cấp một sự thay thế cho các class con.
Nó định nghĩa mỗi hành vi trong lớp riêng, loại bỏ sự cần thiết cho các câu lệnh có điều kiện.
Nó giúp dễ dàng mở rộng và kết hợp hành vi mới mà không thay đổi ứng dụng.
Sử dụng Strategy Pattern khi nào?
Khi nhiều lớp chỉ khác nhau về hành vi.
Khi bạn cần các biến thể khác nhau của thuật toán. TỔNG KẾT
Design Pattern là một vấn đề hết sức quan trọng đối với các tổ chức phát triển
phần mềm hiện nay. Trong quá trình thực hiện đồ án do thời gian nghiên cứu và kinh
nghiệm bản thân còn hạn chế nên một số phần của đồ án nghiên cứu chưa được sâu.
Sau 03 tháng thực hiện nghiên cứu đề tài, dưới sự hướng dẫn tận tình của Tiến sỹ Huỳnh
Xuân Phụng, đồ án của em đã đạt được những kết quả sau:
Kết quả đạt được:
▪ Tìm hiểu và nghiên cứu cơ sở lý thuyết của Design Pattern
▪ Nắm được một số kỹ thuật hay sử dụng và cách sử dụng
▪ Biết áp dụng Design Pattern vào bài toán đơn giản Hạn chế: lOMoARcPSD| 36625228
Trong thời gian qua, chúng em đã cố gắng hết sức để tìm hiểu thực hiện đề tài.
Tuy nhiên với kinh nghiệm và thời gian hạn chế nên không thể tránh khỏi những thiếu
sót trong đồ án. Cụ thể:
▪ Chưa nghiên cứu sâu vào các kỹ thuật của Design Patterns
▪ Đồ án mới tập trung vào một bài toán nhỏ nên vẫn chưa toát nên được tầm
quan trọng của Design Patterns
▪ Trình bày thiếu logic, cách diễn đạt còn kém
Hướng phát triển của đề tài trong tương lai:
Với mong muốn trở thành lập trình viên phần mềm trong tương lai nên trong thời
gian tới em sẽ tiếp tục tìm hiểu và nghiên cứu cũng như hoàn thiện đồ án của mình ở
mức cao nhất. Và sau đó sẽ nghiên cứu và áp dụng Design Patterns vào bài toán Quản
lý mầm non để thấy được tầm quan trọng của nó. Rồi từ đó rút ra kinh nghiệm của
bản thân và cải thiện các kỹ năng cần thiết.
TÀI LIỆU THAM KHẢO
[1]. https://shorturl.at/tADFK
[2]. https://tuanitpro.com/design-pattern-la-gi
[3]. https://blog.duyet.net/2015/02/oop-design-patterns-la-gi
[4]. https://refactoring.guru/design-patterns/catalog
[5]. https://developer.ibm.com/languages/java/
[6]. https://www.journaldev.com/1827/java-design-patterns-example-tutorial