用Rust实现23种设计模式之 模板方法模式
关注我,学习Rust不迷路!!
模板方法模式是一种行为型设计模式,它定义了一个算法的骨架,将一些步骤的实现延迟到子类中。以下是模板方法模式的优点和使用场景:
优点:
- 提高代码复用性:模板方法模式通过将算法的通用部分放在父类中,可以在子类中复用这些通用的算法步骤,避免了重复编写相似的代码。
- 提供了扩展点:模板方法模式允许子类在不改变算法结构的情况下,重新定义算法中的某些步骤,从而提供了扩展点,增加了灵活性和可扩展性。
- 符合开闭原则:模板方法模式通过定义算法的骨架,对扩展开放,对修改关闭,符合开闭原则。
使用场景:
- 当有一个算法的骨架,但其中某些步骤的具体实现可能不同,可以考虑使用模板方法模式。
- 当希望在不改变算法结构的情况下,对某些步骤进行定制化实现时,可以考虑使用模板方法模式。
- 当希望提供一个通用的算法骨架,并允许子类根据需要进行定制化扩展时,可以考虑使用模板方法模式。
Rust实现模板方法模式的代码示例:
下面是一个使用Rust实现模板方法模式的示例代码,带有详细的注释和说明:
// 定义模板方法的抽象类
trait AbstractClass {fn template_method(&self) {self.step1();self.step2();self.step3();}// 定义算法的具体步骤,由子类实现fn step1(&self);fn step2(&self);fn step3(&self);
}
// 具体实现模板方法的子类
struct ConcreteClassA;
impl AbstractClass for ConcreteClassA {fn step1(&self) {println!("ConcreteClassA: Step 1");}fn step2(&self) {println!("ConcreteClassA: Step 2");}fn step3(&self) {println!("ConcreteClassA: Step 3");}
}
struct ConcreteClassB;
impl AbstractClass for ConcreteClassB {fn step1(&self) {println!("ConcreteClassB: Step 1");}fn step2(&self) {println!("ConcreteClassB: Step 2");}fn step3(&self) {println!("ConcreteClassB: Step 3");}
}
fn main() {// 创建具体子类对象let class_a = ConcreteClassA;let class_b = ConcreteClassB;// 调用模板方法class_a.template_method();class_b.template_method();
}
在上述代码中,我们首先定义了模板方法的抽象类AbstractClass,并定义了一个template_method方法,该方法定义了算法的骨架,其中包含了一些具体的步骤,这些步骤由子类实现。
然后,我们创建了两个具体实现模板方法的子类ConcreteClassA和ConcreteClassB。这两个子类分别实现了AbstractClass中的具体步骤方法step1、step2和step3。
在main函数中,我们创建了具体子类对象class_a和class_b,并分别调用了它们的template_method方法,实际上调用了AbstractClass中定义的算法骨架,其中包含了具体步骤的调用。
通过模板方法模式,我们可以定义一个算法的骨架,并将一些具体步骤的实现延迟到子类中,从而提高了代码的复用性和灵活性。