22-策略模式PHP实现

摘要:本文用一个实例场景描述Gof 23设计模式中的策略模式,并用PHP程序代码给予实现,同时也给出实现代码的UML模型。

关键字:Gof 23设计模式策略模式PHP

Strategy based on PHP

Abstract:This paper gives a scene example to describe theuse of Strategy Pattern of Gof 23 Design Pattern,and achieves the example by PHP,at the same time,gives the UML model of realization of the example.

Key word:Gof 23; DesignPattern; Strategy Pattern PHP

1.标准定义

策略模式标准定义:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。

2.分析和说明

策略(Strategy)模式属于对象的行为模式,通过分析Strategy模式可以发现:策略模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。策略模式把行为和环境分开。环境类负责维持和查询行为类,各种算法在具体的策略类中提供。由于算法和环境独立开来,算法的增减,修改都不会影响到环境和客户端。

在软件设计中,经常会遇到因为一开始考虑不够长远而导致后面遇到很大的麻烦。开发者只是想尽快地解决问题而没考虑到后期的维护或者根本没法预料到将来会有什么样的变化干脆置之不理。针对这个问题,Strategy模式提供了一个解决问题的方案:面向接口编程而不是实现,发现其中会改变的部分作为扩展点,然后把它封装起来。

Strategy结构如图1所示,其角色包括环境(Context)角色、抽象策略(Strategy)角色和具体策略(Concrete Strategy)角色。

图1策略模式结构

环境(Context)角色:拥有一个Strategy接口的引用。环境(Context)角色可以是接口、具体类或抽象类。该角色不可缺少。

抽象策略(Strategy)角色:这是一个抽象角色,此角色给出所有的具体策略类所需的统一接口,或者是定义所有支持的算法的公共接口。通常由一个接口或抽象类实现。

具体策略(Concrete Strategy)角色:包装了相关的算法或行为。具体策略(ConcreteStrategy)角色都是由具体类来实现。以Strategy接口实现某具体算法。

当客户调用Context时,它将客户的请求转发给它的Strategy。Context将该算法所需的所有数据传递给Strategy,或者将自身作为参数传递给Strategy,使Strategy可以回调Context。ConcreteStrategy实现具体算法。

3应用场景举例

比如公司在多个行业中有项目,对于不同的行业,项目有不同的做法。行业项目就是环境(Context)角色。有一个抽象策略(Strategy)角色。而银行行业项目管理策略、能源行业项目管理策略、电信行业项目管理策略、政府项目管理策略全部都继承抽象策略并有各个行业的实现模式。

在这里可以把Project类理解为环境(Context)角色。Strategy抽象类是抽象策略(Strategy)角色。BankStrategy类、GovernmentStrategy类、TelecomStrategy类是具体策略(Concrete Strategy)角色。其实现类图如图2所示。BankStrategy类、GovernmentStrategy类和TelecomStrategy类继承Strategy抽象类,Project类关联Strategy抽象类。

图2策略模式类图

4.PHP的实现程序代码

PHP程序实现主要包括Project类,Strategy抽象类,BankStrategy类、GovernmentStrategy类和TelecomStrategy类等5个类。其关系如图2所示。下面分别列出这5个类的程序代码,最后列出测试代码并显示输出结果。

策略模式测试类输出结果如下所示:

参考文献

[1] E.Gamma, R.Helm, R.Johnson, andVlissides. Design Patterns Elements of Reusable Object Oriented Software. Addison-Wesley,1995

[2] E.Gamma, R.Helm, R.Johnson, andVlissides.著,李英军等译,设计模式:可复用面向对象软件的基础,北京:机械工业出版社.2000.9.

[3]明日科技,PHP从入门到精通(第3版),北京:清华大学出版社.2012.5.

[4] [美] Larry Ullman著,季国飞朱佩德译,深入理解PHP:高级技巧、面向对象与核心技术(原书第3版),北京:机械工业出版社.2014.1.

[5] PHP官方网站:http://php.net/.

[6] PHP教程http://www.runoob.com/php/php-oop.html.

[7] PHP面向对象教程http://www.cnblogs.com/xiaochaohuashengmi/archive/2010/09/10/1823042.html

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180423G0999X00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券