PHP设计模式之策略模式(Strategy)入门与应用案例详解
php  /  管理员 发布于 7年前   178
本文实例讲述了PHP设计模式之策略模式(Strategy)入门与应用。分享给大家供大家参考,具体如下: 这个策略模式,意思就是定义一系列算法,把它们一个个封装起来,并且使它们可相互替换,使用得算法的变化可独立于使用它的客户,简单来讲就是,策略模式设计帮助构建的对象不必自身包含逻辑,而是能够根据需要利用其他对象中的算法。 来看下应用场景: 1、 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。 2、 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。 3、 对客户隐藏具体策略(算法)的实现细节,彼此完全独立。 4、客户端必须知道所有的策略类,并自行决定使用哪一个策略类,策略模式只适用于客户端知道所有的算法或行为的情况。 5、 策略模式造成很多的策略类,每个具体策略类都会产生一个新类。 有点模糊是吧,咱就来看一个完整的应用场景: 例如有一个CD类,我们类存储了CD的信息。 咱们接下来,再来了解一下一个网上比较经典的案例,来看张图片: 上面图片的意思可以按着下面这个方式来理解: 1.Joe做了一套相当成功的模拟鸭子的游戏。设计了一个超类Duck,然后让各种鸭子继承这个类。 2.后来客户提出要让鸭子有飞的能力。所以Joe就在超类中加了个fly()方法,这样下面的子类都有飞行的行为。 问题来了:1>原来Duck的子类中竟然有橡皮鸭,橡皮鸭是不会飞的。――Joe用重载的方式,把橡皮鸭的fly()方法设置为空. 2>覆盖fly(),我们看到了橡皮鸭的fly()里,没有任何代码,如果以后我们再添加别的不会飞的鸭子,那我么还要这么处理吗?――那么代码重复了! 3.上面2的方式我们知道是有问题的,所以Joe想到把Duck做成接口,这样每个子类必须实现Duck里的方法。这样就保证每个鸭子都能根据自己的需要添加行为。 问题来了:产品经常处于更新中,规格也在不断的变化。导致每当有新鸭子的时候,Joe就要被迫检查一遍子类是否覆盖了fly()方法。――当你修改某个行为的时候,你必须得往下追踪并在每一个定义此行为的类中修改它。 4.综合以上问题,Joe想到了把那些变化的部分从不变化的位置中抽出来。比如,我们对fly()行为,做了单独的接口FlyBehavior。如果鸭子想要飞行功能的时候,我们就让鸭子实现FlyBehavior. 5.深造:我们想让鸭子有不同的飞行功能,让它在运行时候做不同的飞行动作。让鸭子类实现接口,只能让鸭子有一种行为。 好,接下来看下代码实例: 运行结果: Fly With Wings 咱们可以来总结下在开发过程中,这些设计模式的设计原则,如下: 1.找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起; 2.针对接口编程,不针对实现编程; 3.多用组合,少用继承; 好啦,本次记录就到这里了。 更多关于PHP相关内容感兴趣的读者可查看本站专题:《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》 希望本文所述对大家PHP程序设计有所帮助。
原先的时候,我们在CD类中直接调用getCD方法给出XML的结果
随着业务扩展,需求方提出需要JSON数据格式输出
这个时候我们引进了策略模式,可以让使用方根据需求自由选择是输出XML还是JSON
大概了解了之后,咱们来看一个代码实例,我在网上找的啊,比较简单,大家可以根据自己需要的来扩展一下,如下:cdArr['title'] = $title; $this->cdArr['info'] = $info; } public function getCd($typeObj) { return $typeObj->get($this->cdArr); } } class json { public function get($return_data) { return json_encode($return_data); } } class xml { public function get($return_data) { $xml = ''; $xml .= '
_flyBehavior->fly(); } public function setFlyBehavior(FlyBehavior $behavior){ $this->_flyBehavior = $behavior; }}class RubberDuck extends Duck{}// Test Case$duck = new RubberDuck();/* 想让鸭子用翅膀飞行 */$duck->setFlyBehavior(new FlyWithWings());$duck->performFly();/* 想让鸭子不用翅膀飞行 */$duck->setFlyBehavior(new FlyWithNo());$duck->performFly();
Fly With No Wings您可能感兴趣的文章:
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号