Welcome to the website navigation,本站只接受合法正规的企业网站,欢迎站长们提交你的网站获得展示和流量有任何问题请联系站长,欢迎大家加入本站。

                
提交网站
  • 网站:76083
  • 待审:5
  • APP:577
  • 文章:304411
  • 会员:56004
文字内链包年1000元 文字内链包年1000元 文字内链包年1000元 AI办公网站 AI绘画工具 AIchat

名站导航为爱好php程序的朋友们提供php相关的教程知识。

命令Command模式是GOF23种模式中的一种,是一种行为模式。这种模式很难理解。《设计模式》一书中对它语焉不详。而网上的一些文章对其的解释也是错误的。实际上,命令模式并不是那么神秘。IPFAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

命令模式的理解,关键有2点:IPFAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

1. 使用接口。通常命令模式的接口中只有一个方法。 实现类的方法有不同的功能,覆盖接口中的方法。在面向对象编程中,大量使用if…else…,或者switch…case…这样的条件选择语句是“最差实践”。通常这类代码,意味着有重构的余地。命令模式就是干掉条件选择语句的利器。IPFAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

首先提供一个接口:IPFAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

public interface Command {
	public void execute();
}

然后提供这个接口的实现类。每一个实现类的方法就是if…else…的一个代码块中的代码。这样,调用方直接把一个具体类的具体实例操作传进来即可。如:IPFAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

Public void test(Command para){
   Para.execute();
}

不需要再判断出现了哪种情况,应该执行哪一段代码。一切的问题都由调用方处理。IPFAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

如果不使用命令模式,那么如果情况逐步增多,如,从原来的2种,增加到20种,那么方法中的判断就会从1次增加到19次。而使用命令模式,仅仅调用方需要从2个实现类增加到20个实现类即可。上面的test方法根本不需要做任何改变。IPFAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

2. 主要的用途是,使用参数回调模式。IPFAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

最主要使用命令模式的方式是使用参数回调模式。命令接口作为方法的参数传递进来。然后,在方法体内回调该接口。IPFAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

当然,命令模式还可以使用其他方式来使用。不一定非用参数回调模式。IPFAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

了解完这些之后,可以看一下下面的程序例子。IPFAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

<?php
	/**
	 * 命令模式
	 *
	 * 将一个请求封装为一个对象从而使你可用不同的请求对客户进行参数化,对请求排除或记录请求日志,以及支持可取消的操作
	 */
	 
	// 命令接口
	interface Command
	{
		public function execute();
	}
	
	class Invoker
	{
		private $_command = array();
		public function setCommand($command) {
	 		$this->_command[] = $command;
		}
		public function executeCommand()
		{
			foreach($this->_command as $command) 
			{
             	$command->execute();
	       	}
	    }
    	public function removeCommand($command)
     	{
        	$key = array_search($command, $this->_command);
			if($key !== false)
			{
            	unset($this->_command[$key]);
	  		}
		}
	}
	
	// 命令接受者
	class Receiver
	{
		private $_name = null;
	
		public function __construct($name) {
	        $this->_name = $name;
	    }
	 
	   	public function action()
		{
	         echo $this->_name." 执行攻击命令(action)<br />";
	    }
	
	    public function action1()
		{
	        echo $this->_name." 执行防御命令(action1)<br/>";
	    }
	}
	
	// 具体的命令
	class ConcreteCommand implements Command
	{
		private $_receiver;
		public function __construct($receiver)
	    {
	  		$this->_receiver = $receiver;
	 	}
	
	    public function execute()
	 	{
	  		$this->_receiver->action();
		}
	}
	
	// 具体命令1
	class ConcreteCommand1 implements Command
	{
	    private $_receiver;
	    public function __construct($receiver)
	    {
	   		$this->_receiver = $receiver;
		}
	
		public function execute()
	 	{
			$this->_receiver->action1();
		}
	}	
	
	// 具体命令2
	class ConcreteCommand2 implements Command
	{
		private $_receiver;
		public function __construct($receiver)
	  	{
	     	$this->_receiver = $receiver;
	 	}
	
		public function execute()
	 	{
			$this->_receiver->action();
	    	$this->_receiver->action1();
		}
	}
	
	
	$objRecevier = new Receiver("小狗");
	$objRecevier1 = new Receiver("刺蛇");
	$objRecevier2 = new Receiver("雷兽");
	
	$objCommand = new ConcreteCommand($objRecevier);
	$objCommand1 = new ConcreteCommand1($objRecevier);
	$objCommand2 = new ConcreteCommand($objRecevier1);
	$objCommand3 = new ConcreteCommand1($objRecevier1);
	$objCommand4 = new ConcreteCommand2($objRecevier2); // 使用 Recevier的两个方法
	
	$objInvoker = new Invoker();
	$objInvoker->setCommand($objCommand);
	$objInvoker->setCommand($objCommand1);
	$objInvoker->executeCommand();
	$objInvoker->removeCommand($objCommand1);
	$objInvoker->executeCommand();
	
	$objInvoker->setCommand($objCommand2);
	$objInvoker->setCommand($objCommand3);
	$objInvoker->setCommand($objCommand4);
	$objInvoker->executeCommand();
?>

程序运行结果:IPFAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

小狗 执行攻击命令(action)
小狗 执行防御命令(action1)
小狗 执行攻击命令(action)
小狗 执行攻击命令(action)
刺蛇 执行攻击命令(action)
刺蛇 执行防御命令(action1)
雷兽 执行攻击命令(action)
雷兽 执行防御命令(action1)

命令模式的核心思想是,带有某个方法的具体类的具体实例操作,作为接口传给使用方。对象的具体类型信息消失。在使用方代码中拿到这个接口后调用这个接口的方法。IPFAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

具体的执行效果,取决的命令发起人提供的对象是哪一个实现类的。这给了命令发起人完全的控制能力,而使用方代码不关心具体的命令类和方法。同时也使条件判断语句成为多余。IPFAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

简单吗?命令模式其实就是这么简单。IPFAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

其实,GOF的23个设计模式中,好几个模式使用了相同的技巧来实现。GOF对模式的划分,是根据目的来的,而不是技巧来的。因此,Command模式和策略模式等其实使用的技法是一样的。 上回和一个同事聊技术。他的背景是Windows C 和Windows驱动开发。 他说,他不知道什么设计模式。他觉得最有用的就是回调函数。Command模式也是使用回调函数。java没有函数指针,java中一切都是类和类的具体实例操作。因此,就需要使用一个只有一个函数的接口,它的具体实例操作表示函数指针。其实是一回事。IPFAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

设计模式是比较低层次的设计思想。在更高层次上,还有更加宏观的一些设计技巧。 Bob大叔的一本书不错,忘记名字了。 《Unix编程艺术》也不错,都是讲更高层次上的设计的。IPFAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!


IPFAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

名站网址导航

PhP程序设计模式:模板Template模式IPFAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

GOF给模板方法(Template Method)模式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。这里的算法的结构,可以理解为你根据需求设计出来的业务流程。特定的步骤就是指那些可能在内容上存在变数的环节。IPFAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

好了关于php程序的知识就说到这里希望可以帮助需要的朋友。,

标签:

分享到:

  admin

注册时间:

网站:0 个   APP:3 个  文章:0 篇

  • 76083

    网站

  • 577

    APP

  • 304411

    文章

  • 56004

    会员

赶快注册账号,推广您的网站吧!
文章分类
热门网站
最新入驻APP小程序

宝贝市场2023-02-08

宝贝市场——买手和卖家商品展示

夺宝助手2023-02-08

夺宝助手小程序,查看每日快夺宝平

查诚信2023-02-08

查诚信是一款免费的商业查询工具

车价天天报2023-02-08

快速连接汽车销售,获知汽车最新报

考勤助理小程序2023-02-08

上班签到考勤,实时定位,后台轻松

汽车报价大全查询2023-02-08

汽车报价大全查询提供最新汽车市