策略模式:定义算法,并将其封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

步骤:1、抽象策略角色:定义接口或抽象类

2、具体策略角色:实现该接口(抽象类),即具体的算法实现

3、环境角色:对具体方法的调用

适用场景:1、多个类只是行为方式不用,在操作时动态的选择具体使用的方法(算法)

2、在不同的环境下使用算法,比if {}else{}更具有维护性和扩展性

例子代码如下

<?php
//定义接口 interface FlyBehavior{ public function fly(); } //具体方法实现(例子中有不同的飞行方式) class FlyWithWings implements FlyBehavior{ public function fly(){ echo "Fly With Wings \n"; } } class FlyWithNo implements FlyBehavior{ public function fly(){ echo "Fly With No Wings \n"; } }
//定义鸭子的超类 class Duck{ private $_flyBehavior; public function performFly(){ $this->_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();

初学PHP和设计模式,以上是今天早上所学,不足之处,请多多指教 也欢迎互相交流

最新文章

  1. 游戏buff设计参见
  2. 51nod 1150 Logarithm
  3. 为什么匿名内部类参数必须为final类型(转载)
  4. Windows API 进程状态信息函数
  5. 再议Unity 3D
  6. 408. Valid Word Abbreviation
  7. C++普通函数与模板函数以及特化函数重载的优先级问题
  8. 读书笔记(一)—— 浅析浏览器渲染过程和html中的文件加载
  9. java 连接 postgresql
  10. MySQL Error--The Table is full
  11. 13.3SolrCloud集群使用手册之Zookeeper指令
  12. mysql 不同引擎的比较
  13. Python爬虫Urllib库的高级用法
  14. TP3.2整合uplodify文件上传
  15. Python 将一个列表里面的元素拼接成一个字符串
  16. GoLand语言快捷键
  17. 中文乱码—Servlet—SpringMVC
  18. TED_Topic2:My desperate journey with a human smuggler
  19. 洛谷P4171 [JSOI2010] 满汉全席 [2-SAT,Tarjan]
  20. Flume入门——Selector、Chanel等

热门文章

  1. linux exec操作文件描述符
  2. Python中如何调用Linux命令
  3. python大规模爬取京东
  4. swiper.js 碰到的坑
  5. 团体队列UVA540 Team Queue(队列简单用法)
  6. phpcms v9模版调用代码
  7. 你不知道的 flex 技巧
  8. 搭建带热更新功能的本地开发node server
  9. java当中成员变量和局部变量的区别
  10. Spring Boot 构建 WAR和JAR 文件