The implementation of "template method" design pattern usually utilizes a base class and a derived class: The base class will define a workflow and the derived class override method in the workflow.
However, Rust doesn't have "inheritance". While I am not sure if this is a correct way to do, but I found that we can use the trait
feature to implement the same thing.
First we define a BaseHandler
trait to define the workflow: in the get
function we call authorized
and do_get
function. Then our "derived" class UserHandler
will implement this trait with overriding those 2 methods.
trait BaseHandler { fn authorized(&self) -> bool { false } fn get(&self) -> String { if !self.authorized() { return "403 Forbidden".to_string(); } println!("Do some basic work"); // handle rest work to do_get self.do_get() } fn do_get(&self) -> String; } struct UserHandler; impl BaseHandler for UserHandler { fn authorized(&self) -> bool { true } fn do_get(&self) -> String { "Processed by User handler".to_string() } } fn main() { let handler = UserHandler {}; println!("{}", handler.get()); }
Result:
Do some basic work Processed by User handler
Top comments (0)