Project: rạp hát Facade và Command macro
Đề xây mặt tiền rạp hát hai nút và remote macro mở tiệc có hoàn tác, kèm rubric chấm bốn mức.
Chuyên giaDesign pattern ~120 phút
Ôn lại trước khi học
Giới thiệu
Bài này xây mặt tiền rạp hát 2 nút và remote mở tiệc. Làm xong bạn sẽ gom thao tác rối thành nút bấm gọn.
Kiến thức cần nhớ
Đề bài rạp hát
- Có 6 thiết bị: máy chiếu, màn, âm thanh, đầu đĩa, đèn, bỏng ngô.
- Yêu cầu 1: xem phim chỉ còn 2 nút xem và kết thúc.
- Yêu cầu 2: 1 nút mở tiệc bật cả phòng, 1 nút hoàn tác.
- Ví dụ đời thường: 1 nút bấm mở cả rạp phim mini tại nhà.
Facade gom 10 bước thành 2 nút
- Facade là mặt tiền gọi đúng thứ tự 10 bước giúp bạn.
- Bấm xem: bật tuần tự từ bỏng ngô tới đầu đĩa rồi chạy.
- Bấm kết thúc: tắt theo thứ tự ngược lại.
- Cửa tinh chỉnh vẫn mở để người sành chỉnh tay từng máy.
Macro và hoàn tác
- Macro giữ danh sách lệnh nhỏ, chạy tuần tự như 1 lệnh.
- Mỗi lệnh nhỏ lưu trạng thái cũ trước khi chạy.
- Hoàn tác chạy ngược thứ tự để trả về đúng ban đầu.
- Ví dụ đời thường: 1 nút mở tiệc bật đèn nhạc máy lạnh cùng lúc.
| Tiêu chí | Đạt | Chưa đạt |
|---|---|---|
| Mặt tiền | 2 nút đủ 10 bước đúng thứ tự | Người dùng vẫn gọi thẳng máy |
| Macro | Danh sách lệnh nhỏ chạy tuần tự | 1 lệnh khổng lồ ôm hết |
| Hoàn tác | Lưu cũ, trả ngược thứ tự | Đoán ngược không lưu gì |
Ví dụ
- Input: bấm xem khi tất cả đang tắt. Output: 6 thiết bị lên đúng thứ tự, phim chạy.
- Giải thích: mặt tiền gọi đủ 10 bước không sót bước nào.
- Input: chạy macro mở tiệc rồi hoàn tác. Output: cuối cùng 6 máy về đúng trạng thái trước tiệc.
- Giải thích: hoàn tác ngược thứ tự dùng trạng thái đã lưu.
💻 Bài tập
Ngôn ngữ: C++17 (hoặc Java). Đây là project, dành 90 phút. Dùng lại code ngày 31 và 81. Nộp vào day-125-hometheater/.
Bài 1: Facade cho rạp hát
6 thiết bị: PopcornPopper, TheaterLights, Screen, Projector, Amplifier, StreamingPlayer. Mỗi thiết bị có trạng thái đọc được (bật/tắt, âm lượng, độ sáng...).
HomeTheaterFacade::watchMovie(movie) và endMovie() như ngày 31. Thêm:
listenToMusic(playlist): chỉ bật đèn 60%, amp, player.- Gọi
watchMoviekhi đang nghe nhạc: chuyển đúng, không bật lại thiết bị đang bật. - Người dùng vẫn gọi thẳng
amp.setVolume(20)được.
Bài 2: Macro tiệc có hoàn tác
partyOnlàMacroCommandgồm: đèn dim 30%, amp bật âm lượng 11, player bật playlist, bỏng ngô bật.- Mỗi lệnh nhỏ lưu trạng thái trước khi chạy. Hoàn tác chạy ngược thứ tự và trả về đúng trạng thái đó.
- Remote có 4 khe:
movie(lệnh gọi Facade),music,party,off. Cóundonhiều bước.
Trạng thái ban đầu: đèn 80%, amp tắt
partyOn; undo -> đèn 80%, amp tắt (không phải "đèn 100%")
movie; party; undo; undo -> mọi thiết bị về trạng thái ban đầu
Bài 3: Nhật ký và báo cáo (nâng cao)
- Mọi lệnh bọc bằng
LoggingCommand(ngày 28). In nhật ký 1 buổi tối: 10 thao tác. snapshot()của cả rạp trả chuỗi trạng thái 6 thiết bị. Test so snapshot trước và sau mỗi cặpexecute/undo.- Viết
README.md: sơ đồ lớp, vai trò Facade và Command, và giải thích vì sao lệnhmoviegọi Facade thay vì gọi 10 thiết bị.
✅ Tiêu chí hoàn thành
- Test chuyển từ nghe nhạc sang xem phim không bật lại thiết bị.
- Undo trả đúng trạng thái trước, kiểm bằng
snapshot(). - Nhật ký 10 thao tác.
-
README.mdcó sơ đồ và giải thích.
❓ Câu hỏi ôn tập
- Facade gom 10 bước thành 2 nút thế nào?
- Macro chạy nhiều lệnh như 1 lệnh ra sao?
- Hoàn tác đúng cần lưu gì?
- Vì sao không dồn macro vào mặt tiền?
🌕 Bạn đã hoàn thành ngày 125. Làm hết bài tập phía trên rồi sang ngày tiếp theo.