Mẫu Proxy trong Java

1. Khái quát chung

Proxy pattern cho phép chúng ta tạo một trung gian hoạt động như một giao diện cho một tài nguyên khác , đồng thời ẩn đi sự phức tạp cơ bản của thành phần.

2. Ví dụ về mẫu proxy

Hãy xem xét một đối tượng Java nặng (như kết nối JDBC hoặc SessionFactory ) yêu cầu một số cấu hình ban đầu.

Chúng tôi chỉ muốn các đối tượng như vậy được khởi tạo theo yêu cầu và khi chúng đã có, chúng tôi muốn sử dụng lại chúng cho tất cả các lệnh gọi:

Bây giờ hãy tạo một giao diện đơn giản và cấu hình cho đối tượng này:

public interface ExpensiveObject { void process(); }

Và việc triển khai giao diện này với cấu hình ban đầu lớn:

public class ExpensiveObjectImpl implements ExpensiveObject { public ExpensiveObjectImpl() { heavyInitialConfiguration(); } @Override public void process() { LOG.info("processing complete."); } private void heavyInitialConfiguration() { LOG.info("Loading initial configuration..."); } }

Bây giờ chúng tôi sẽ sử dụng mẫu Proxy và khởi tạo đối tượng của chúng tôi theo yêu cầu:

public class ExpensiveObjectProxy implements ExpensiveObject { private static ExpensiveObject object; @Override public void process() { if (object == null) { object = new ExpensiveObjectImpl(); } object.process(); } }

Bất cứ khi nào khách hàng của chúng tôi gọi phương thức process () , họ sẽ chỉ thấy quá trình xử lý và cấu hình ban đầu sẽ luôn bị ẩn:

public static void main(String[] args) { ExpensiveObject object = new ExpensiveObjectProxy(); object.process(); object.process(); }

Lưu ý rằng chúng tôi đang gọi phương thức process () hai lần. Ở hậu trường, phần cài đặt sẽ chỉ diễn ra một lần - khi đối tượng được khởi tạo lần đầu tiên.

Đối với mọi cuộc gọi tiếp theo khác, mẫu này sẽ bỏ qua cấu hình ban đầu và chỉ xử lý sẽ xảy ra:

Loading initial configuration... processing complete. processing complete.

3. Khi nào sử dụng Proxy

Hiểu cách sử dụng một mẫu là quan trọng.

Hiểu rõ khi nào sử dụng nó là rất quan trọng.

Hãy nói về thời điểm sử dụng mẫu Proxy:

  • Khi chúng ta muốn một phiên bản đơn giản của một vật thể nặng hoặc phức tạp. Trong trường hợp này, chúng ta có thể biểu diễn nó bằng một đối tượng khung tải đối tượng gốc theo yêu cầu, còn được gọi là khởi tạo lười biếng. Đây được gọi là proxy ảo
  • Khi đối tượng ban đầu hiện diện trong không gian địa chỉ khác và chúng tôi muốn đại diện cho nó cục bộ . Chúng tôi có thể tạo một proxy thực hiện tất cả những thứ cần thiết như tạo và duy trì kết nối, mã hóa, giải mã, v.v., trong khi khách hàng truy cập nó như nó đã có trong không gian địa chỉ cục bộ của họ. Đây được gọi là Remote Proxy
  • Khi chúng ta muốn thêm một lớp bảo mật vào đối tượng cơ bản ban đầu để cung cấp quyền truy cập có kiểm soát dựa trên quyền truy cập của máy khách . Đây được gọi là Bảo vệ Proxy

4. Kết luận

Trong bài viết này, chúng ta đã xem xét mẫu thiết kế proxy. Đây là một lựa chọn tốt trong các trường hợp sau:

  • Khi chúng ta muốn có một phiên bản đơn giản hóa của một đối tượng hoặc truy cập đối tượng một cách an toàn hơn
  • Khi chúng tôi muốn một phiên bản cục bộ của một đối tượng từ xa

Mã nguồn đầy đủ cho ví dụ này có sẵn trên GitHub.