问题描述
我正在寻找一种在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 Language和Generic 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设计决策,例如所有权,生存期和可变性;这些都不是唯一的。
另请参阅: