MST

星途 面试题库

面试题:Rust 中如何实现类似面向对象的策略模式

在 Rust 中,描述如何通过trait和结构体来实现策略模式。请写出一个简单的示例代码,包含至少两个不同的策略实现,并展示如何在运行时切换这些策略。
42.3万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
  1. 策略模式简介
    • 策略模式定义了一系列算法,将每个算法封装起来,使它们可以相互替换,让算法的变化独立于使用算法的客户。在Rust中,可以通过trait和结构体来实现策略模式。
  2. 示例代码
// 定义一个trait,作为策略的抽象
trait Strategy {
    fn execute(&self, a: i32, b: i32) -> i32;
}

// 第一个策略实现:加法
struct AddStrategy;

impl Strategy for AddStrategy {
    fn execute(&self, a: i32, b: i32) -> i32 {
        a + b
    }
}

// 第二个策略实现:乘法
struct MultiplyStrategy;

impl Strategy for MultiplyStrategy {
    fn execute(&self, a: i32, b: i32) -> i32 {
        a * b
    }
}

// 上下文结构体,持有一个策略的引用
struct Context<'a> {
    strategy: &'a dyn Strategy,
}

impl<'a> Context<'a> {
    fn new(strategy: &'a dyn Strategy) -> Self {
        Context { strategy }
    }

    fn execute_strategy(&self, a: i32, b: i32) -> i32 {
        self.strategy.execute(a, b)
    }
}

fn main() {
    let add_strategy = AddStrategy;
    let multiply_strategy = MultiplyStrategy;

    // 使用加法策略
    let context = Context::new(&add_strategy);
    let result1 = context.execute_strategy(3, 4);
    println!("Addition result: {}", result1);

    // 切换到乘法策略
    let context = Context::new(&multiply_strategy);
    let result2 = context.execute_strategy(3, 4);
    println!("Multiplication result: {}", result2);
}

上述代码中:

  • 首先定义了Strategy trait,它有一个execute方法,这是所有具体策略都要实现的方法。
  • AddStrategyMultiplyStrategy结构体分别实现了Strategy trait,提供了不同的算法实现。
  • Context结构体持有一个指向实现了Strategy trait的对象的引用,并提供了execute_strategy方法来执行当前的策略。
  • main函数中,创建了不同策略的实例,并通过Context结构体在运行时切换并执行不同的策略。