PHP 策略模式(设计模式PHP)

1.模式定义在软件开发中经常会遇到类似的情况。实现某个功能有很多种算法或策略。我们可以根据不同的环境或条件选择不同的算法或策略来完成功能。如搜索、排序等。常见的方法是在类中硬编码。如果需要提供多种搜索算法,可以把这些算法写成一个类,在类中提供多种方法,每种方法对应一种特定的搜索算法;当然,这些搜索算法也可以封装在一个统一的方法中,通过if…else…或case等条件判断语句进行选择。这两种实现方法可以称为硬编码。如果需要添加新的搜索算法,需要修改封装算法类的源代码。要更改算法,还需要修改客户端调用代码。这个算法类封装了大量的搜索算法,会很复杂,很难维护。如果我们在客户端包含这些策略,这就更不可取了,这会导致客户端程序维护的庞大和困难,如果有大量的算法可供选择,问题会变得更加严重。
如何将算法与对象分离,使算法可以独立于使用它的客户而改变?为此,我们引入了策略模型。
策略,也称为算法簇模式,定义了不同的算法族,这些算法族可以互相替换。这种模式使得算法的改变独立于使用算法的客户。
常见的使用场景,如对象过滤,可以按日期或ID过滤;例如,在单元测试中,我们可以在文件和内存存储之间切换。
2.UML类图3。示例代码ObjectCollection.php
phpnamespace设计模式\行为\策略;/* * * object collection class */class object collection {/* * * * @ vararray */private $ elements;/* * * * @ var comparator interface */private $ comparator;/* * * * @ param array $ elements */public function _ _ construct(array $ elements=array()){ $ this-elements=$ elements;}/* * * * @返回数组*/公共函数sort() { if(!$ this-Comparator){ throw new \ logic exception(\ ‘ Comparator未设置\ ‘);} $ callback=array($ this-comparator,’ compare ‘);uasort($this-elements,$ callback);返回$ this-elements;}/* * * * @ param comparator interface $ comparator * * @ return void */public function set comparator(comparator interface $ comparator){ $ this-comparator=$ comparator;}}ComparatorInterface.php
phpnamespace设计模式\行为\策略;/* * * comparator interface class */interface比较器接口{/* * @ param mixed $ a * @ param mixed $ b * * @ return bool */public function compare $ a,$ b);}DateComparator.php
phpnamespace设计模式\行为\策略;/** * DateComparator类*/ClassDateComparator实现比较器接口{/* * { @ inherit doc } */公共函数Compare ($ a,$ b){ $ adate=new \ datetime($ a[‘ date ‘]);$ bDate=new \ DateTime($ b[‘ date ‘]);if($ aDate==$ bDate){ return 0;} else { return $ aDate $ bDate-1 : 1;} } } IdComparator.php
phpnamespace设计模式\行为\策略;/* * * id comparator class */class id comparator实现比较器接口{/* * { @ inherit doc } */公共函数compare ($ a,$ b){ if($ a[‘ id ‘]=$ b[‘ id ‘]){ return 0;} else { return $ a[‘ id ‘]$ b[‘ id ‘]-1 : 1;} }}4.测试代码Tests/StrategyTest.php
PHP命名空间设计模式\行为\策略\测试;使用设计模式\行为\策略\数据比较器;使用设计模式\行为\策略\ id比较器;使用设计模式\行为\策略\对象集合;使用设计模式\行为\策略\策略;/** * 策略模式测试*/class策略测试扩展\ PHPUnit _ Framework _ test case { public function getid collection(){ return array(array(‘id’=2),array(‘id’=1),array(‘id’=1),array(array(‘id’=3),array(‘ id ‘=2),array(‘id’=1)),array(‘ id ‘=1);}公共函数getdate集合(){ return array(array(‘ date ‘=’ 2014-03-03 ‘)、array(‘date’=’2015-03-02 ‘)、array(‘date’=’2013-03-01 ‘)、array(‘date’=’2013-03-01 ‘)、array(array(‘date’=’2014-02-03 ‘)、array(‘ date ‘=’ 2013-013公共函数testIdComparator($collection,$ expected){ $ obj=新对象集合($ collection);$ obj-set comparator(新id comparator());$ elements=$ obj-sort();$ first element=array _ shift($ elements);$ this-assert等于($应为,$ first element);}/* * * * @数据提供程序获取日期集合*/公共函数testDateComparator($collection,$ expected){ $ obj=新对象集合($ collection);$ obj-设置比较器(新的日期比较器());$ elements=$ obj-sort();$ first element=array _ shift($ elements);$ this-assert等于($应为,$ first element);}}5、总结策略模式属于对象行为型模式,主要针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。通常,策略模式适用于当一个应用程序需要实现一种特定的服务或者功能,而且该程序有多种实现方式时使用。

其他教程

小两口在5.9m2的阳台上种菜,蔬果在疫情下不停生长。

2022-8-20 6:03:02

其他教程

vue脚手架使用webpack打包(vue脚手架使用教程)

2022-8-20 6:05:06

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索