【Rust中的策略模式实现】
use std::collections::HashMap;
type Data = HashMap<String, u32>;
//为了输出不同格式的报告的“接口定义”
trait Formatter {
fn format(&self, data: &Data, buf: &mut String);
}
struct Statement;
//调用入口,将类型传进去,内部调用format,根据类型的format实现从而将结果输出给buffer s
impl Statement {
fn generate<T: Formatter>(g: T, s: &mut String) {
// 这里实际用途中,会是调用具体的获取数据的方法或者在内部直接取到某些需要格式化的数据,
//这里为了方便就使用了Hashmap直接的表示
let mut data = HashMap::new();
data.insert("key1".to_string(), 1);
data.insert("key2".to_string(), 2);
// generate report
g.format(&data, s);
}
}
//html 格式报告示意
struct Html;
impl Formatter for Html {
fn format(&self, data: &Data, buf: &mut String) {
for (k, v) in data {
let entry = format!("<br>{} {}<br>", k, v);
buf.push_str(&entry);
}
}
}
//json格式报告示意
struct Json;
impl Formatter for Json {
fn format(&self, data: &Data, buf: &mut String) {
buf.push('[');
for (k, v) in data.into_iter() {
let entry = format!(r#"{{"{}":"{}"}}"#, k, v);
buf.push_str(&entry);
buf.push(',');
}
buf.pop();
buf.push(']');
}
}
fn main() {
let mut s = String::from("");
Statement::generate(Html, &mut s);
println!("{}", s);
s.clear();
println!("{}", s);
Statement::generate(Json, &mut s);
println!("{}", s);
}