Rust 中的設計模式:策略模式 -Strategy-
策略模式介紹
策略模式是一種行爲設計模式,允許你定義一系列算法,將它們封裝爲一個對象,並藉助特徵使它們可互換。
1,上下文想要應用某種算法,爲此它包含了一個實現 algorithm 方法的 Strategy 特徵。
2,當需要該策略時,將啓動 StrategyA 或 StrategyB,並調用算法方法。
有人認爲這是依賴注入的一種形式,因爲方法只在接口上調用,而不是在具體對象上調用。
在 Rust 中實現策略模式
新建一個 Rust 項目:
cargo new strategy_pattern
我們將從定義 TravelStrategy 開始
trait TravelStrategy {
fn travel(&self, distance: i16);
}
然後我們將定義 TrainStrategy:
struct TrainStrategy;
impl TravelStrategy for TrainStrategy {
fn travel(&self, distance: i16) {
println!("Travelled {} km by train", distance);
}
}
TrainStrategy 結構體爲空。我們在上面實現了一個 travel 方法,它只是打印旅行的距離。
CarStrategy 也類似:
struct CarStrategy;
impl TravelStrategy for CarStrategy {
fn travel(&self, distance: i16) {
println!("Travelled {} km by car", distance);
}
}
定義 TravelHub
struct TravelHub<T: TravelStrategy> {
strategy: T,
}
我們在這裏使用泛型,T: TravelStrategy 意味着我們可以擁有任何類型,只要它實現了 TravelStrategy 特徵。
爲什麼是泛型?泛型使得在具體類中傳遞更容易,而無需求助於 Box 或類似的方法,並且它使代碼更具可讀性。
現在實現 TravelHub:
impl<T: TravelStrategy> TravelHub<T> {
fn new(strategy: T)->Self {
Self {
strategy
}
}
fn customer_travel(&self, distance:i16) {
self.strategy.travel(distance);
}
}
1,首先定義一個構造函數,它獲取一個具體類作爲形參。這個具體的類必須實現 TravelStrategy 特性。
2,然後我們定義 customer_travel 方法,它只調用所選策略上的 travel 方法。
測試
fn main() {
let travelhub = TravelHub::new(TrainStrategy{});
travelhub.customer_travel(20);
}
用 TrainStrategy 作爲參數實例化一個 travelhub。由於 TrainStrategy 實現了 TravelStrategy 特性,我們可以將其作爲參數傳遞。
執行 cargo run,結果如下:
Travelled 20 km by train
總結
如你所見,實現非常簡單。泛型的使用可以避免使用 Box 類型,它使代碼更具可讀性。這種模式也可以說是依賴注入的一種形式,因爲在調用方不知道底層類的情況下,只調用接口上的方法。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/pR_m_RvvwBrUsMMxbAmtiw