PHP设计模式-命令 发表于 2017-04-25 | 分类于 PHP | 评论数: | 阅读次数: 本文字数: 4k | 阅读时长 ≈ 4 分钟 适用性 命令模式:就是在依赖的类中间加一个命令类,本来可以直接调用的类方法现在通过命令来调用,已达到 解耦的的目的,其次可以实现undo,redo等操作,因为你知道调了哪些命令 下面我们来用命令模式实现一个记事本,涉及的命令: 新建 写入 保存 代码示例 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248/** * 命令接口 */interface Order{ /** * 执行命令 * @return void */ public function execute();}/** * 文本类 */class Text{ /** * 创建 * * @param string $name 文件名称 * @return string */ public function create($filename='') { echo "创建了一个文件: {$filename} \n"; } /** * 写入 * * @param string $content 文件名称 * @return string */ public function write($filename='', $content='') { echo "文件{$filename}写入了内容: {$content} \n"; } /** * 保存 * * @param string $filename 文件名称 * @return string */ public function save($filename='') { echo "保存了一个文件: {$filename} \n"; }}/** * 控制台 * 负责命令执行 */class Console{ /** * 命令队列 * @var array */ private $_orderList = []; /** * 添加命令到队列 * @param Order $order */ public function add(Order $order) { array_push($this->_orderList, $order); } /** * 执行命令 * @return mixed */ public function run() { foreach ($this->_orderList as $k => $v) { $v->execute(); } }}/** * 创建文本命令 */class OrderCreate implements Order{ /** * 文本类实体 * @var object */ private $_text; /** * 命令参数 * @var array */ private $_arguments = [ 'filename' => '' ]; /** * 构造函数 * * @param Text $text * @param array $arguments */ public function __construct(Text $text, $arguments=[]) { $this->_text = $text; $this->_arguments = $arguments; } /** * 执行命令 * * @return void */ public function execute() { $this->_text->create($this->_arguments['filename']); }}/** * 保存文本命令 */class OrderSave implements Order{ /** * 文本类实体 * @var object */ private $_text; /** * 命令参数 * @var array */ private $_arguments = [ 'filename' => '' ]; /** * 构造函数 * * @param Text text * @param array $arguments */ public function __construct(Text $text, $arguments=[]) { $this->_text = $text; $this->_arguments = $arguments; } /** * 执行命令 * * @return void */ public function execute() { $this->_text->save($this->_arguments['filename']); }}/** * 写入文本命令 */class OrderWrite implements Order{ /** * 文本类实体 * @var object */ private $_text; /** * 命令参数 * @var array */ private $_arguments = [ 'filename' => '', 'content' => '' ]; /** * 构造函数 * * @param Text text * @param array $arguments */ public function __construct(Text $text, $arguments=[]) { $this->_text = $text; $this->_arguments = $arguments; } /** * 执行命令 * * @return void */ public function execute() { $this->_text->Write( $this->_arguments['filename'], $this->_arguments['content'] ); }}try { // 创建一个记事本实例 $text = new Text(); // 创建命令 $create = new OrderCreate($text, [ 'filename' => 'test.txt' ]); // 写入命令 $write = new OrderWrite($text, [ 'filename' => 'test.txt', 'content' => 'life is a struggle' ]); // 保存命令 $save = new OrderSave($text, [ 'filename' => 'text.txt' ]); // 创建一个控制台 $console = new Console(); // 添加命令 $console->add($create); $console->add($write); $console->add($save); // 运行命令 $console->run();} catch (\Exception $e) { echo $e->getMessage();}