Dynamic proxy, protection proxy và vườn thú proxy

Đại diện tạo động lúc chạy, bảo vệ theo vai trò người dùng, và bản đồ tám loại proxy trong bài này.
Chuyên giaDesign pattern ~60 phút

Giới thiệu

Bài này học proxy đứng giữa để kiểm tra quyền. Hiểu rồi bạn sẽ phân quyền gọn mà ít code.

Kiến thức cần nhớ

Dynamic proxy là gì

  • Dynamic proxy là đại diện do hệ thống sinh lúc chạy.
  • Bạn chỉ viết 1 bộ xử lý chung, hệ thống tự đúc lớp.
  • Ví dụ đời thường: 1 con dấu dùng chung cho nhiều loại đơn.
  • Thêm giao diện mới chỉ cần gắn bộ xử lý vào.

Protection proxy phân quyền

  • Protection proxy kiểm tra quyền trước mỗi cuộc gọi.
  • Chính chủ được sửa thông tin, cấm tự sửa điểm đánh giá.
  • Người yêu được sửa đánh giá, cấm sửa thông tin người khác.
  • Ví dụ đời thường: lễ tân chỉ cho khách vào phòng của mình.

Vườn thú proxy

Ba loại đã học: Remote (đại diện máy ở xa), Virtual (hoãn tạo đối tượng nặng), Protection (kiểm tra quyền). Sách Head First kể thêm 6 loại:

ProxyViệc
FirewallChặn truy cập mạng từ nguồn không tin cậy
Smart ReferenceLàm thêm việc mỗi lần truy cập, ví dụ đếm số tham chiếu
CachingLưu kết quả tốn kém để trả lại nhanh, là một dạng Virtual proxy
SynchronizationCho nhiều luồng truy cập đối tượng an toàn
Complexity HidingChe hệ phức tạp như Facade, nhưng vẫn kiểm soát truy cập
Copy-On-WriteHoãn sao chép tới khi có người sửa, dạng biến thể của Virtual proxy
  • Ví dụ đời thường: mỗi loại như 1 kiểu bảo vệ khác nhau.
CáchViết taySinh động
Số lớp1 lớp cho 1 giao diện1 bộ xử lý cho nhiều giao diện
Thêm mớiViết thêm lớpGắn vào là xong
Gỡ lỗiDễ đọcKhó hơn vì sinh lúc chạy

Ví dụ

  • Input: chính chủ gọi setRating(10) cho chính mình. Output: bị chặn, điểm giữ nguyên.
  • Giải thích: protection proxy cấm tự chấm điểm cho mình.
  • Input: người yêu gọi setRating(9). Output: cho qua và lưu thành công.
  • Giải thích: đúng vai trò nên được chuyển lời tới hồ sơ thật.

💻 Bài tập

Ngôn ngữ: Java (dùng java.lang.reflect.Proxy) hoặc Python (dùng __getattr__). C++ không có dynamic proxy sẵn. Nộp vào day-123/.

Bài 1: Protection proxy cho hồ sơ hẹn hò

interface Person {
  String getName(); String getGender(); String getInterests(); int getGeekRating();
  void setName(String n); void setGender(String g); void setInterests(String i); void setGeekRating(int r);
}
HandlerĐược phépBị chặn
OwnerInvocationHandlermọi get, set thông tin của mìnhsetGeekRating
NonOwnerInvocationHandlermọi get, setGeekRatingmọi set khác

Bị chặn thì ném IllegalAccessException (bọc trong UndeclaredThrowableException với Java).

owner.setInterests("leo núi")   -> thành công
owner.setGeekRating(10)         -> bị chặn, điểm không đổi
other.setGeekRating(9)          -> thành công, điểm trung bình cập nhật
other.setName("X")              -> bị chặn

Bài 2: Proxy dùng chung cho nhiều interface

Viết 1 handler LoggingHandler ghi "[time] Interface.method(args) -> result (ms)" và 1 hàm wrap(Object target, Class<?>... interfaces).

Bọc 3 đối tượng khác interface: Person, GumballMachineRemote (ngày 98), WeatherService (ngày 98). Không viết lớp proxy riêng nào.

Bài 3: Vườn thú proxy (nâng cao)

Viết thêm và kết hợp:

  1. CachingHandler: nhớ kết quả các phương thức get trong 5 giây.
  2. RetryHandler: phương thức ném lỗi mạng thì thử lại tối đa 3 lần.
  3. TimingHandler: cảnh báo khi phương thức chạy quá 100 ms.
  4. Chồng Logging(Retry(Caching(target))). Viết test cho thứ tự: lỗi lần 1, thành công lần 2, lần gọi sau lấy từ cache.

Viết bảng tổng hợp các loại proxy đã học: remote, virtual, protection, caching, logging, retry. Mỗi loại 1 dòng mục đích và 1 ví dụ thật.

✅ Tiêu chí hoàn thành

  • Test quyền Bài 1 pass.
  • 1 handler bọc được 3 interface khác nhau.
  • Test chồng 3 handler đúng thứ tự hành vi.
  • Bảng 6 loại proxy.

❓ Câu hỏi ôn tập

  • Dynamic proxy khác proxy viết tay ở điểm gì?
  • Protection proxy phân quyền chính chủ và người yêu thế nào?
  • Kể tên 4 trong 8 loại proxy?
  • Khi nào nên dùng proxy động?

🌕 Bạn đã hoàn thành ngày 123. Làm hết bài tập phía trên rồi sang ngày tiếp theo.

Bớt paste mù, hiểu sâu từng dòng mình viết.

180 Days Challenge. 180 ngày cai nghiện vibe code.