如何实现Strategy设计模式?

问题描述 投票:0回答:2

我正在研究推荐系统。这将是一个 Android 应用程序,用户将在其中输入他们的偏好,并根据这些偏好,向该用户显示其他匹配的配置文件。我正在从用户那里获取数据并将其存储在 Firebase 中。

这些是数值,为了向该用户显示匹配的个人资料,我使用两种算法来计算用户之间的相似度计数:

Cosine similarity
Pearson correlation

我从应用程序中获取算法的名称,然后执行该算法以便向用户显示类似的配置文件。

if (request.query.algo === "cosine") {
  // compute cosine value
} 
else if (request.query.algo === "pearson-correlation") {
  // compute pearson correlation coefficents

}

由于它将是一个实时应用程序,所以这种方法是完全错误的,我想实现策略设计模式,其中算法可以在运行时而不是编译时决定。

那么现在的问题是,在策略设计模式中,我如何决定何时使用哪种算法?

例如,当您使用信用卡购买商品时,信用卡的类型并不重要。所有信用卡都有一个磁条,其中包含编码信息。这些条带及其包含的内容代表“接口”,卡的类型代表“实现”。每张信用卡都可以替换为任何其他信用卡,并且所有信用卡都完全独立。

同样,在策略设计模式的运行时,我应该基于什么基础在 Cosine 和 Pearson 之间进行选择?

algorithm design-patterns trigonometry pearson-correlation
2个回答
0
投票

根据我的理解,在两个用户配置文件具有非常不同的项目集(在本例中为偏好设置)的情况下,Pearson 的表现会更差。

也许这可能是您的标准?如果匹配偏好的数量高于某个阈值,则使用 Pearson,而对于其他情况,则使用余弦。

您也许可以向用户显示一个接近匹配列表,该列表使用余弦来向用户显示其个人资料有很多共同点。

然后您可以显示第二个列表,其中显示“您可能也感兴趣”,该列表使用 Pearson 来显示没有很多共同偏好的匹配个人资料。


0
投票
  1. 定义策略接口 创建一个声明策略方法的接口。这允许不同的实现可以互换。

    public interface SortingStrategy {
    void sort(int[] numbers);
    }

  1. 实施具体策略 创建实现 SortingStrategy 接口的具体类。每个类别都为策略提供不同的算法。
    public class BubbleSortStrategy implements SortingStrategy {
        @Override
        public void sort(int[] numbers) {
            // Bubble sort algorithm
            int n = numbers.length;
            for (int i = 0; i < n - 1; i++) {
                for (int j = 0; j < n - i - 1; j++) {
                    if (numbers[j] > numbers[j + 1]) {
                        int temp = numbers[j];
                        numbers[j] = numbers[j + 1];
                        numbers[j + 1] = temp;
                    }
                }
            }
        }
    }
  1. 上下文类 context 类使用 SortingStrategy 的实例来执行排序算法。它将实际排序委托给策略对象。
    public class Context {
        private SortingStrategy strategy;
    
        public void setStrategy(SortingStrategy strategy) {
            this.strategy = strategy;
        }
    
        public void executeStrategy(int[] numbers) {
            strategy.sort(numbers);
        }
    }

用法示例:


    public class Main {
        public static void main(String[] args) {
            int[] numbers = {5, 3, 8, 1, 2};
    
            Context context = new Context();
    
            // Using BubbleSortStrategy
            context.setStrategy(new BubbleSortStrategy());
            context.executeStrategy(numbers);
    
            // Print sorted numbers (Bubble sort result)
            for (int number : numbers) {
                System.out.print(number + " ");
            }
        }
    }

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.