Strategy pattern is used when there are multiple ways of achieving a task. For e.g., say if a task is to log, then there could be different strategies to accomplish this: LogToFile, LogToDatabase, LogToWebService.
These strategies may use different set of algorithms to achieve a task. LogToFile my implement one set of algorithms, where as LogToDatabase may implement completely different set of algorithm.
To implement strategy pattern:
class LogToFile() {} class LogToDatabase() {} class LogToWebServices() {}
/** * To make algorithms interchangable */ interface Logger { public function log($data); } /** * Make different strategies interchangable by implementing Logger interface */ class LogToFile implements Logger { public function log($data) { var_dump("Log to a file data : " . $data); } } class LogToDatabase implements Logger { public function log($data) { var_dump("Log to a Database : " . $data); } } class LogToWebServices implements Logger { public function log($data) { var_dump("Log to a Web SErvices : " . $data); } }
By doing so, at runtime we can pass different strategies (LogToFile or LogToDatabase) to accomplish a task
class App { public function log($data, Logger $logger) { $logger->log($data); } } (new App)->log('User Deleted', new LogToFile); (new App)->log('User Deleted', new LogToDatabase); (new App)->log('User Deleted', new LogToWebServices);