在PHP设计模式中,invoke方法通常用于实现“策略模式”和“命令模式”。
在“策略模式”中,invoke方法可以用来执行不同的策略类。例如:
interface PaymentStrategy {
public function invoke();
}
class CreditCardPayment implements PaymentStrategy {
public function invoke() {
echo "Processing credit card payment...";
}
}
class PayPalPayment implements PaymentStrategy {
public function invoke() {
echo "Processing PayPal payment...";
}
}
class PaymentContext {
private $paymentStrategy;
public function __construct(PaymentStrategy $paymentStrategy) {
$this->paymentStrategy = $paymentStrategy;
}
public function processPayment() {
$this->paymentStrategy->invoke();
}
}
$creditCardPayment = new CreditCardPayment();
$paymentContext = new PaymentContext($creditCardPayment);
$paymentContext->processPayment(); // Output: Processing credit card payment...
在“命令模式”中,invoke方法可以用来执行具体的命令操作。例如:
interface Command {
public function invoke();
}
class Light {
public function turnOn() {
echo "Light turned on";
}
public function turnOff() {
echo "Light turned off";
}
}
class TurnOnLightCommand implements Command {
private $light;
public function __construct(Light $light) {
$this->light = $light;
}
public function invoke() {
$this->light->turnOn();
}
}
class TurnOffLightCommand implements Command {
private $light;
public function __construct(Light $light) {
$this->light = $light;
}
public function invoke() {
$this->light->turnOff();
}
}
class RemoteControl {
private $command;
public function setCommand(Command $command) {
$this->command = $command;
}
public function pressButton() {
$this->command->invoke();
}
}
$light = new Light();
$turnOnCommand = new TurnOnLightCommand($light);
$turnOffCommand = new TurnOffLightCommand($light);
$remote = new RemoteControl();
$remote->setCommand($turnOnCommand);
$remote->pressButton(); // Output: Light turned on
$remote->setCommand($turnOffCommand);
$remote->pressButton(); // Output: Light turned off
在这两个案例中,invoke方法被用来执行具体的操作,从而实现了策略模式和命令模式。这样可以灵活的切换不同的策略或命令,而不需要修改调用方的代码。