如何在Rust中为策略模式建模?

问题描述

我正在寻找一种在Rust中实现策略模式的方法。我希望实现类似于此伪代码的东西:

class StrategyBase {
    Data data;
    def abstract methodAWorkingOnData();
    def abstract methodBWorkingOnData();
}

class StrategyImplOne {
    def methodAWorkingOnData()
        ... method code ...

    def methodBWorkingOnData()
        ... method code ....
}

class StrategyImpltwo {
    def methodAWorkingOnData()
        ... method code ...

    def methodBWorkingOnData()
        ... method code ....
}

我希望我可以有一个绑定了两个特征的结构,但是我找不到实现这种模式的方法

解决方法

definition of the strategy pattern上的The Rust Programming LanguageGeneric Types,Traits,and Lifetimes一章结合起来会得出直接的结果。

创建代表通用接口的特征,并多次实现该特征。然后持有一个实现特征的通用类型:

struct Context<S> {
    strategy: S,}

impl<S> Context<S>
where
    S: Strategy,{
    fn do_things(&self) {
        println!("Common preamble");
        self.strategy.execute();
        println!("Common postamble");
    }
}

trait Strategy {
    fn execute(&self);
}

struct ConcreteStrategyA;

impl Strategy for ConcreteStrategyA {
    fn execute(&self) {
        println!("ConcreteStrategyA")
    }
}

struct ConcreteStrategyB;

impl Strategy for ConcreteStrategyB {
    fn execute(&self) {
        println!("ConcreteStrategyB")
    }
}

fn main() {
    let a = Context {
        strategy: ConcreteStrategyA,};
    a.do_things();

    println!("\n---\n");

    let b = Context {
        strategy: ConcreteStrategyB,};
    b.do_things();
}

如果在编译时知道所有可能的实现,则可以使用枚举而不是特征。

您仍然必须应对任何正常的Rust设计决策,例如所有权,生存期和可变性;这些都不是唯一的。

另请参阅: