Trước tiên, chúng ta hãy cùng cafedev giới thiệu mọi thứ về Proxy Design Pattern và phần code ví dụ chi tiết nhằm giúp ace dễ hiểu khi áp dụng trên các ngôn ngữ khác nhau. Ace có thể tham khảo thêm các bài khác tại series Design Pattern tại đây.

Proxy có nghĩa là ‘thay cho’, đại diện ‘hoặc’ thay cho ‘hoặc’ thay mặt ‘là nghĩa đen của proxy và điều đó giải thích chính xác về Proxy Design Pattern .

Proxy còn được gọi là người thay thế, tay cầm và trình bao bọc. Chúng có liên quan chặt chẽ về cấu trúc(structure), nhưng không phải mục đích, với Adapters and Decorators

Một ví dụ trong thế giới thực có thể là séc hoặc thẻ tín dụng là đại diện cho những gì có trong tài khoản ngân hàng của chúng ta. Nó có thể được sử dụng thay cho tiền mặt và cung cấp một phương tiện để truy cập tiền mặt đó khi được yêu cầu. Và đó chính xác là những gì mà Pattern Proxy làm – ” Kiểm soát và quản lý quyền truy cập vào đối tượng mà chúng đang bảo vệ “.

1. Hành vi

Như trong decorator pattern, các proxy có thể được xâu chuỗi với nhau. Máy khách và mỗi proxy tin rằng nó đang ủy quyền thông báo cho máy chủ thực:

2. Khi nào sử dụng Pattern này?

Proxy pattern được sử dụng khi chúng ta cần tạo một wrapper để che đi sự phức tạp của đối tượng chính khỏi client.

Các loại proxy

Proxy từ xa(Remote proxy):

Chúng có nhiệm vụ đại diện cho đối tượng được định vị từ xa. Nói chuyện với đối tượng thực có thể liên quan đến việc sắp xếp và giải nén dữ liệu và nói chuyện với đối tượng từ xa. Tất cả logic đó được gói gọn trong các proxy này và ứng dụng khách không cần lo lắng về chúng.

Proxy ảo(Virtual proxy):

Các proxy này sẽ cung cấp một số kết quả mặc định và tức thì nếu đối tượng thực được cho là mất một thời gian để tạo ra kết quả. Các proxy này bắt đầu hoạt động trên các đối tượng thực và cung cấp kết quả mặc định cho ứng dụng. Sau khi đối tượng thực được thực hiện xong, các proxy này sẽ đẩy dữ liệu thực tế đến máy khách nơi nó đã cung cấp dữ liệu giả trước đó.

Proxy bảo vệ(Protection proxy):

Nếu một ứng dụng không có quyền truy cập vào một số tài nguyên thì các proxy đó sẽ nói chuyện với các đối tượng trong ứng dụng có quyền truy cập vào tài nguyên đó và sau đó lấy lại kết quả.

Proxy thông minh(Smart Proxy):

Một proxy thông minh cung cấp thêm lớp bảo mật bằng cách lồng ghép các hành động cụ thể khi đối tượng được truy cập. Một ví dụ có thể là kiểm tra xem đối tượng thực có bị khóa trước khi nó được truy cập hay không để đảm bảo rằng không đối tượng nào khác có thể thay đổi nó.

3. Vài ví dụ

Một kịch bản rất đơn giản trong cuộc sống thực là mạng internet ở trường đại học của chúng ta, hạn chế một số truy cập trang web. Trước tiên, proxy sẽ kiểm tra máy chủ lưu trữ mà bạn đang kết nối, nếu nó không phải là một phần của danh sách trang web bị hạn chế, thì nó sẽ kết nối với internet thực. Ví dụ này dựa trên proxy Bảo vệ.

Hãy xem nó hoạt động như thế nào:

Giao diện(Interface) của Internet

package com.saket.demo.proxy; 
  
public interface Internet 
{ 
    public void connectTo(String serverhost) throws Exception; 
} 

RealInternet.java

package com.saket.demo.proxy; 
  
public class RealInternet implements Internet 
{ 
    @Override
    public void connectTo(String serverhost) 
    { 
        System.out.println("Connecting to "+ serverhost); 
    } 
} 

ProxyInternet.java

package com.saket.demo.proxy; 
  
import java.util.ArrayList; 
import java.util.List; 
  
  
public class ProxyInternet implements Internet 
{ 
    private Internet internet = new RealInternet(); 
    private static List<String> bannedSites; 
      
    static
    { 
        bannedSites = new ArrayList<String>(); 
        bannedSites.add("abc.com"); 
        bannedSites.add("def.com"); 
        bannedSites.add("ijk.com"); 
        bannedSites.add("lnm.com"); 
    } 
      
    @Override
    public void connectTo(String serverhost) throws Exception 
    { 
        if(bannedSites.contains(serverhost.toLowerCase())) 
        { 
            throw new Exception("Access Denied"); 
        } 
          
        internet.connectTo(serverhost); 
    } 
  
} 

Client.java

package com.saket.demo.proxy; 
  
public class Client 
{ 
    public static void main (String[] args) 
    { 
        Internet internet = new ProxyInternet(); 
        try
        { 
            internet.connectTo("cafedev.vn"); 
            internet.connectTo("abc.com"); 
        } 
        catch (Exception e) 
        { 
            System.out.println(e.getMessage()); 
        } 
    } 
} 

Là một trong những trang được đề cập trong các trang bị cấm, Vì vậy,

Chạy chương trình sẽ cho kết quả:

Connecting to cafedev.vn
Access Denied

4. Những lợi ích:

  • Một trong những ưu điểm của Proxy pattern là tính bảo mật.
  • Mẫu này tránh trùng lặp các đối tượng có thể có kích thước lớn và tốn nhiều bộ nhớ. Điều này sẽ làm tăng hiệu suất của ứng dụng.
  • Proxy từ xa cũng đảm bảo tính bảo mật bằng cách cài đặt proxy code cục bộ (sơ khai) trong máy khách và sau đó truy cập vào máy chủ với sự trợ giúp của mã từ xa.

5. Hạn chế / Hậu quả:

Mẫu này giới thiệu một lớp trừu tượng khác mà đôi khi có thể là một vấn đề nếu code RealSubject được một số máy khách truy cập trực tiếp và một số trong số họ có thể truy cập các lớp Proxy. Điều này có thể gây ra hành vi khác nhau.

6. Điểm thú vị:

  • Có một số khác biệt giữa các Pattern liên quan. Giống như Adapter pattern cung cấp một giao diện khác cho chủ đề của nó, trong khi các Pattern Proxy cung cấp cùng một giao diện từ đối tượng ban đầu nhưng trình trang trí(decorator) cung cấp một giao diện nâng cao. Mẫu trang trí thêm hành vi bổ sung trong thời gian chạy.
  • Proxy được sử dụng trong Java API: java.rmi. *;

Cài ứng dụng cafedev để dễ dàng cập nhật tin và học lập trình mọi lúc mọi nơi tại đây.

Tài liệu từ cafedev:

Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của cafedev để nhận được nhiều hơn nữa:

Chào thân ái và quyết thắng!

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!