java - 如何使用 runnable 将 java 命令模式迁移到 PHP 7.4?
问题描述
出于学习目的,我正在尝试将此 Java 命令模式示例迁移到 PHP:
https://codereview.stackexchange.com/questions/52110/command-pattern-implementation
正如@simon 评论的那样,使用方法引用运算符会使代码现代化很多:
class MyCommand implements Order {
private final Runnable action;
public MyCommand(Runnable action) {
this.action = action;
}
@Override
public void execute() {
action.run();
}
}
然后你可以创建这样的命令:
MyCommand bsc = new MyCommand(stock::buy);
MyCommand ssc = new MyCommand(stock::sell);
我当前的 PHP 实现在这里:https ://3v4l.org/iIHn9
那么在 PHP 中实现 MyCommand 类的最佳方法是什么?
解决方案
在 PHP 中,您可以使用call_user_func
类似于 Java 中的方法引用来实现相同的目的。
<?php
namespace StockCommandNS;
//Command interface
interface Order {
public function execute();
}
//Receiver class
class StockTrade {
public function buy() {
print("You want to buy stocks\n");
}
public function sell() {
print("You want to sell stocks\n");
}
}
//Invoker class
class Agent {
public function placeOrder(Order $order) {
$order->execute($order);
}
}
//ConcreteCommand Class
class GenericOrder implements Order {
private $action;
public function __construct($action) {
$this->action = $action;
}
public function execute() {
call_user_func($this->action);
}
}
$stock = new StockTrade();
$bsc = new GenericOrder([$stock, 'buy']);
$ssc = new GenericOrder([$stock, 'sell']);
$agent = new Agent();
$agent->placeOrder($bsc); // Buy Shares
$agent->placeOrder($ssc); // Sell Shares
7.2.0 - 7.4.3 的输出
You want to buy stocks
You want to sell stocks
运行 PHP 代码:https ://3v4l.org/fWo20
另一个不太干净的选择是使用变量函数。
class GenericOrder implements Order {
private $stock;
private $action;
public function __construct($stock, $action) {
$this->stock = $stock;
$this->action = $action;
}
public function execute() {
$method = $this->action;
$this->stock->$method();
}
}
$bsc = new GenericOrder($stock, 'buy');
$ssc = new GenericOrder($stock, 'sell');
我不确定在所有情况下使用方法引用的方法都更好。根据经验,您应该始终根据每个用例考虑何时使用方法引用或匿名函数是命令模式。
推荐阅读
- python - 在 React 文件夹结构中将杂项文件、脚本放在哪里?
- excel - 基于excel数字计数的IF语句
- c - 更改按钮样式(C win32)
- ios - 您的规范来源都不包含满足依赖项的规范:Firebase (~> 6.33.0)、Firebase (= 6.33.0, ~> 6.33.0)
- javascript - 如何在使用 jquery 填写表单之前禁用提交表单按钮?
- php - 为 Laravel 8 路由定义命名空间
- javascript - 使用 React Hooks,使用“useState”和“useEffect”,有没有办法渲染一个状态,直到状态有一个值?
- python - python __module__ dunder 是 __main__
- ios - Xcode 12.0 iOS 13+ UIViewController() viewWillDisappear() 问题
- python-3.x - 摆脱 Python shapefile 图中的多余线条?