PHP实现Gof 23设计模式中的策略模式实例与UML模型详解

摘要:本文通过一个示例场景来描述Gof 23设计模式中的策略模式,并用PHP程序代码实现。它还提供了用于实现代码的 UML 模型。

PHP实现Gof 23设计模式中的策略模式实例与UML模型详解

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

基于PHP的策略

摘要:本文给出了一个场景实例来描述Gof 23设计模式中策略模式的使用,并用PHP实现了该实例,同时给出了实例实现的UML模型。

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

1. 标准定义

策略模式的标准定义:定义一系列算法,将它们一一封装,并使其可以互换。这种模式允许算法独立于使用它的客户端而改变。

2.分析与说明

策略模式属于对象的行为模式。通过分析Strategy模式,我们可以发现,Strategy模式针对的是一组算法,将每个算法封装成具有公共接口的独立类,以便它们可以相互替换。策略模式允许算法改变而不影响客户端。策略模式将行为与环境分开。环境类负责维护和查询行为类,具体策略类中提供了各种算法。由于算法和环境是独立的,算法的增删改查不会影响环境和客户端。

在软件设计中,我们常常会因为一开始想得不够远而在后来遇到很大的麻烦。开发人员只想尽快解决问题,而不考虑后期维护或者干脆忽略未来会发生什么变化。针对这个问题,策略模式提供了一种解决方案:针对接口而不是实现进行编程,发现会发生变化的部分作为扩展点,然后进行封装。

Strategy结构如图1所示,其角色包括Context角色、Abstract Strategy角色和Concrete Strategy角色。

图1 策略模式结构

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

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

具体策略作用:封装相关的算法或行为。 ConcreteStrategy 角色由具体类实现。使用Strategy接口来实现特定的算法。

当客户端调用 Context 时,它将客户端的请求转发到其策略。 Context 将算法所需的所有数据传递给 Strategy,或者将自身作为参数传递给 Strategy,以便 Strategy 回调给 Context。 ConcreteStrategy 实现特定的算法。

3 应用场景举例

比如一个公司有多个行业的项目,不同行业的项目有不同的做法。行业项目是上下文角色。有一个抽象的策略角色。银行业的项目管理战略、能源行业的项目管理战略、电信行业的项目管理战略、政府项目管理战略等都继承了抽象的战略,并针对每个行业都有实施模型。

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

图2 策略模式类图

4.PHP实现程序代码

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

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

参考

[1] E.Gamma、R.Helm、R.Johnson 和 Vlissides。可重用面向对象软件的设计模式元素。艾迪生韦斯利,1995

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

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

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

[5] PHP 官方网站:.

[6] PHP教程.

[7] PHP 面向对象教程

你可能想看:
« 上一篇
下一篇 »

相关推荐

php实时推送,php实地培训

2026年10月05日

46阅读

php乱码出现问号的原因,php乱码出现问号的原因有哪些

2026年10月05日

39阅读

php一句话木马,一句话木马ctf

2026年10月05日

41阅读

php获取数组长度,php中如何获取数组的长度

2026年10月05日

43阅读

php面试题库及答案,php程序员面试真题库

2026年10月05日

41阅读

phpcontent-type修改,php源码二次修改需要多少钱

2026年10月05日

38阅读