设计思路
- 定义特质:分别定义
Transformer
和 Validator
特质,每个特质包含相应的方法。
- 泛型结构体
Pipeline
:该结构体内部使用 Vec
来存储实现了特质的对象。
- 链式调用方法:为
Pipeline
结构体实现添加操作和执行操作的方法,添加操作的方法返回 &mut self
以支持链式调用。
代码实现
// 定义Transformer特质
trait Transformer<T> {
fn transform(&self, data: T) -> T;
}
// 定义Validator特质
trait Validator<T> {
fn validate(&self, data: &T) -> bool;
}
// 泛型结构体Pipeline
struct Pipeline<T> {
operations: Vec<Box<dyn Operation<T>>>,
}
// 定义一个统一的Operation特质,整合Transformer和Validator
trait Operation<T> {
fn execute(&self, data: &mut T);
}
impl<T> Operation<T> for Box<dyn Transformer<T>> {
fn execute(&self, data: &mut T) {
*data = self.transform(*data);
}
}
impl<T> Operation<T> for Box<dyn Validator<T>> {
fn execute(&self, data: &mut T) {
if!self.validate(data) {
panic!("Validation failed");
}
}
}
impl<T> Pipeline<T> {
// 添加操作的方法
fn add_operation<O>(&mut self, operation: O)
where
O: 'static + Operation<T>,
{
self.operations.push(Box::new(operation));
}
// 执行操作的方法
fn execute(&self, mut data: T) -> T {
for operation in &self.operations {
operation.execute(&mut data);
}
data
}
}
// 示例实现Transformer
struct ExampleTransformer;
impl<T: std::ops::AddAssign<T>> Transformer<T> for ExampleTransformer {
fn transform(&self, data: T) -> T {
let mut new_data = data.clone();
new_data += new_data;
new_data
}
}
// 示例实现Validator
struct ExampleValidator;
impl<T: std::cmp::PartialEq> Validator<T> for ExampleValidator {
fn validate(&self, data: &T) -> bool {
*data != Default::default()
}
}
fn main() {
let mut pipeline = Pipeline::<i32>::new();
pipeline.add_operation(ExampleTransformer);
pipeline.add_operation(ExampleValidator);
let result = pipeline.execute(5);
println!("Result: {}", result);
}