策略模式,又称策略模式,属于行为设计模式。Gof类图及讲解GoF定义:定义一系列算法,将它们一一封装,并使它们可以互换。此模式使算法能够独立于使用它的客户端而变化。GoF类图代码实现接口Strategy{functionAlgorithmInterface();}classConcreteStrategyAimplementsStrategy{functionAlgorithmInterface(){echo"AlgorithmA";}}classConcreteStrategyB实现策略{functionAlgorithmInterface(){echo"AlgorithmB";}}classConcreteStrategyCimplementsStrategy{functionAlgorithmInterface(){echo"算法C";}}定义算法抽象和实现。类上下文{私人$策略;函数__construct(策略$s){$this->strategy=$s;}functionContextInterface(){$this->strategy->AlgorithmInterface();}}定义执行环境上下文。$strategyA=newConcreteStrategyA();$context=newContext($strategyA);$context->ContextInterface();$strategyB=newConcreteStrategyB();$context=newContext($strategyB);$context->ContextInterface();$strategyC=newConcreteStrategyC();$context=newContext($strategyC);$context->ContextInterface();最后,根据需要在客户端调用合适的算法。是不是很简单的设计模式。大家有没有发现这个模型和我们一开始讲的简单工厂很像,那么它们有什么区别呢?工厂相关模式属于创建模式。顾名思义,这种模式用于创建对象和返回新对象。调用对象用什么方法由客户端决定,策略模式属性行为模式通过执行上下文封装了要调用的函数方法,客户端只需要调用执行上下文的方法即可,在这里,我们会发现客户端需要实例化具体的算法类,这似乎不如简单工厂好用。既然如此,为什么不尝试结合工厂模式和策略模式来实现一个模式呢?作为一个思考题,这个实现就留给大家了。提示:将Context类的__construct变成一个简单的工厂方法。既然和简单工厂如此相似,那么我们也遵循简单工厂方法:我们是手机厂商(Client),想找某家工厂(ConcreteStrategy)做一批手机,下订单用这个工厂通过渠道商(Context)来制造手机,渠道商会直接联系代工厂(Strategy),直接将完成的手机发货给i(ContextInterface())。同样的,我也不需要关心他们的具体实现,我只需要监督联系我们的渠道商,是不是很省心!完整代码:https://github.com/zhangyue0503/designpatterns-php/blob/master/10.strategy/source/strategy.php例子还是短信功能。具体需求可以参考简单工厂模式中的解释,不过这个Back我们是用策略模式来实现的!短信发送类图完整源码:https://github.com/zhangyue0503/designpatterns-php/blob/master/10.strategy/source/strategy-message.phpmessage=$msg;}publicfunctionSendMessage(){$this->message->send();}}$bdMsg=newBaiduYunMessage();$msgCtx=newMessageContext($bdMsg);$msgCtx->SendMessage();$alMsg=newAliYunMessage();$msgCtx=newMessageContext($alMsg);$msgCtx->SendMessage();$jgMsg=new极光消息();$msgCtx=newMessageContext($jgMsg);$msgCtx->SendMessage();说明注意下面的类图,基本工厂模式和简单工厂模式没有区别。策略模式定义算法。从概念上讲,这些算法执行相同的工作,但实现方式不同,但物是死的,人是活的。是的,如何使用取决于每个人的兴趣。策略模式可以优化单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试下一个问题。策略模式是中场休息。还有超过一半的模型尚未讨论。下一个是近几年的一个网红玩家:责任链模型。别告诉我你没听说过这个名字。Laravel的中间件就是这种产品的典型例子。实现哦!!各媒体平台均可搜索【硬核项目经理】
