Proxy pattern

- 4 mins

Định nghĩa

Proxy pattern là một design pattern thuộc họ structural, mục đích của pattern này là tạo một lớp trung gian giữa object truy cập đến và phần logic chính xử lý object này để thực hiện một vài yêu cầu khác.

Solution

Ban đầu object gửi từ client trỏ thẳng đến service chịu trách nhiệm xử lý yêu cầu này. Proxy pattern tạo một class có cùng interface với service gốc. Object được gửi từ client sẽ trỏ đến proxy này để xử lý trước khi chuyển hướng đến service chính chịu trách nhiệm. Concept này tương tự như data transfer object (DTO không phải proxy pattern)

package io.diary.designpatternsdemo.ProxyPattern;

public interface IRecommendService {
    
    void addInfo();
    
    void recommend();
    
}

Ví dụ ta có một interface IRecommendService khai báo 2 phương thức là addInfo và recommend. Các thuật toán gợi ý khác nhau sẽ implement lại phương thức này để xử lý theo mục đích của từng thuật toán như hot item, related item, sale item,v.v. Trước khi request gửi đến từ client được xử lý bởi một trong các service thuật toán đã implement lại interface trên, giả sử ta cần phải bổ sung thêm một số thông tin liên quan đến user như ngày sinh, giới tính, địa điểm. Nếu với mỗi class thuật toán ta lại thêm một đoạn code bổ sung các thông tin trên trong method recommend sẽ gây ra trùng lặp code. Để xử lý ta có thể tạo thêm một class khác ProxyRecommendManager để nhận request từ client, bổ sung các thông tin trong method addInfo trước khi gọi đến phương thức recommend của thuật toán phù hợp.

package io.diary.designpatternsdemo.ProxyPattern;

public class ProxyRecommendManager implements IRecommendService {

    @Override
    public void addInfo() {
        
    }

    @Override
    public void recommend() {

    }
}

Use case proxy

Ưu/nhược điểm

Ví dụ

RecommendApplication.java

public class RecommendApplication {

    public static void main(String[] args) {
        ProxyRecommendManager proxyRecommendManager = new ProxyRecommendManager();
        proxyRecommendManager.recommend();
    }

}

ProxyRecommendManager.java

public class ProxyRecommendManager implements IRecommendService {

    private HotItemRecommendService hotItemRecommendService;

    public ProxyRecommendManager() {
        this.hotItemRecommendService = new HotItemRecommendService();
    }

    @Override
    public void addInfo() {
        System.out.println("Add review item");
    }

    @Override
    public void recommend() {
        addInfo();
        if (isHotItemRequest()) {
            hotItemRecommendService.recommend();
        }
    }

    private boolean isHotItemRequest() {
        return true;
    }

}

HotItemRecommendService.java

public class HotItemRecommendService implements IRecommendService {

    @Override
    public void addInfo() {
    }

    @Override
    public void recommend() {
        System.out.println("Recommend hot item");
    }
}

IRecommendService.java

public interface IRecommendService {

    void addInfo();

    void recommend();

}

Khi chạy chương trình sẽ thu được kết quả:

Add review item
Recommend hot item

Process finished with exit code 0

Việc addInfo các thông tin review của item được thực hiện ở proxy cho bất kì service thuật toán nào thay vì phải cài đặt ở bên trong từng thuật toán để tránh trùng lặp code và dễ quản lí việc thêm thông tin mới sau này.

comments powered by Disqus
rss facebook twitter github gitlab youtube mail spotify lastfm instagram linkedin google google-plus pinterest medium vimeo stackoverflow reddit quora quora