• 简单工厂
  1. <?php
  2. # 简单工厂
  3. abstract class mycoach
  4. {
  5. public function __construct(){}
  6. }
  7.  
  8. class cultivatecpc extends mycoach{
  9. public function __construct(){
  10. echo "把陈培昌培养为搏击教练"."\n";
  11. }
  12. }
  13.  
  14. class cultivatecj extends mycoach{
  15. public function __construct(){
  16. echo "把程劲培养为搏击教练"."\n";
  17. }
  18. }
  19.  
  20. class martialclub
  21. {
  22. public function cultivate($name)
  23. {
  24. switch($name){
  25. case 'cj':
  26. return new cultivatecj();
  27. case 'cpc':
  28. return new cultivatecpc();
  29. default:
  30. echo '培养一个小教练'."\n";
  31. break;
  32. }
  33. return null;
  34. }
  35. }
  36. class clubmaster{
  37. public function cultivate()
  38. {
  39. $myclub = new martialclub();
  40. $myclub->cultivate('cj');
  41. $myclub = new martialclub();
  42. $myclub->cultivate('cpc');
  43. }
  44. }
  45.  
  46. $mymaster = new clubmaster();
  47. $mymaster->cultivate();

输出结果:

  1. 把程劲培养为搏击教练
  2. 把陈培昌培养为搏击教练
  • (复杂)工厂
  1. <?php
  2. abstract class mycoach
  3. {
  4. public function __construct()
  5. {}
  6. }
  7.  
  8. class cpc extends mycoach
  9. {
  10. public function __construct()
  11. {
  12. echo "培养出了搏击教练昌仔"."\n";
  13. }
  14. }
  15.  
  16. class cj extends mycoach
  17. {
  18. public function __construct()
  19. {
  20. echo "培养出了搏击教练劲儿弟弟"."\n";
  21. }
  22. }
  23.  
  24. interface cultivate{
  25. function cultivate();
  26. }
  27.  
  28. class cultivatecpc implements cultivate
  29. {
  30. public function cultivate()
  31. {
  32. return new cpc();
  33. }
  34. }
  35.  
  36. class cultivatecj implements cultivate
  37. {
  38. public function cultivate()
  39. {
  40. return new cj();
  41. }
  42. }
  43.  
  44. class coach{
  45. public function __construct()
  46. {
  47. $coach = new cultivatecpc();
  48. $coach->cultivate();
  49.  
  50. $coach = new cultivatecj();
  51. $coach->cultivate();
  52. }
  53. }
  54.  
  55. $littlecoach = new coach();

输出结果:

  1. 培养出了搏击教练昌仔
  2. 培养出了搏击教练劲儿弟弟
  • 观察者模式
  1. <?php
  2. class watcher
  3. {
  4. private $name;
  5. public function __construct($myname){
  6. $this->name=$myname;
  7. }
  8. public function update($food)
  9. {
  10. switch($food)
  11. {
  12. case '奶油蛋糕':
  13. echo $food."上桌了,".$this->name.'取出了一份纸盘子和塑料叉子,切了一块'."\n";
  14. break;
  15. case '烤鸭':
  16. echo $food."上桌了,".$this->name.'取了张薄饼,夹了些许葱丝,刷了些甜面酱'."\n";
  17. break;
  18. default:
  19. echo $food."上桌了,".$this->name."赶紧加了两筷子"."\n";
  20. break;
  21. }
  22. return null;
  23. }
  24. }
  25.  
  26. class watchee
  27. {
  28. private $watchlist = [];
  29. public function addwatcher($watcher)
  30. {
  31. $this->watchlist[]=$watcher;
  32. }
  33. public function removewatcher($watcher)
  34. {
  35. $target = array_search($watcher,$this->watchlist);
  36. $target = (int)$target;
  37. unset($this->watchlist[$target]);
  38. //echo $target."\n";
  39. }
  40. public function loaddish($dishname)
  41. {
  42. $this->notify($dishname);
  43. }
  44. public function notify($dishname)
  45. {
  1.       #这里推荐用foreach循环,for循环带来的陷阱是,如果以数字为索引,执行removewatcher方法后,有些索引就没了,访问不到就会报错
  1.     foreach($this->watchlist as $k=>$v)
  2. {
  3. $this->watchlist[$k]->update($dishname);
  4. }
  5. }
  6.  
  7. }
  8.  
  9. $cpc = new watcher('陈培昌');
  10. $cj = new watcher('程劲');
  11. $observee = new watchee();
  12. $observee->addwatcher($cpc);
  13. $observee->addwatcher($cj);
  14. $observee->loaddish('葱香四川凉面');
  15. $observee->removewatcher($cj);
  16. $observee->loaddish('奶油蛋糕');
  17. $xxd = new watcher('徐晓冬');
  18. $observee->addwatcher($xxd);
  19. $observee->loaddish('避风塘茄子');

输出结果:

  1. 葱香四川凉面上桌了,陈培昌赶紧加了两筷子
  2. 葱香四川凉面上桌了,程劲赶紧加了两筷子
  3. 奶油蛋糕上桌了,陈培昌取出了一份纸盘子和塑料叉子,切了一块
  4. 避风塘茄子上桌了,陈培昌赶紧加了两筷子
  5. 避风塘茄子上桌了,徐晓冬赶紧加了两筷子

PHP常见设计模式的更多相关文章

  1. JavaScript 中常见设计模式整理

    开发中,我们或多或少地接触了设计模式,但是很多时候不知道自己使用了哪种设计模式或者说该使用何种设计模式.本文意在梳理常见设计模式的特点,从而对它们有比较清晰的认知. JavaScript 中常见设计模 ...

  2. JS中常见设计模式总结

    github: https://github.com/14glwu/FEInterviewBox/tree/master/JS%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F ...

  3. java之 ------ DAO设计模式的【具体解释】及常见设计模式的【应用】

    DAO Data Access Object(数据訪问接口) 一.场景和问题 在Java程序中.常常须要把数据持久化,也须要获取持久化的数据.可是在进行数据持久化的过程中面临诸多问题(如:数据源 不同 ...

  4. JAVA设计模式简介及六种常见设计模式详解

    一.什么是设计模式                                                                                           ...

  5. Golang 常见设计模式之单例模式

    之前我们已经看过了 Golang 常见设计模式中的装饰和选项模式,今天要看的是 Golang 设计模式里最简单的单例模式.单例模式的作用是确保无论对象被实例化多少次,全局都只有一个实例存在.根据这一特 ...

  6. 【Java基础】浅谈常见设计模式

    Num1:单例模式 基本概念:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 常见写法: 懒汉式 public class Singleton { /* 持有私有静态实例,防止被引用,此处赋值 ...

  7. Javascript常见设计模式解析

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性.毫无疑问,设计模式于己 ...

  8. Golang 常见设计模式之选项模式

    熟悉 Python 开发的同学都知道,Python 有默认参数的存在,使得我们在实例化一个对象的时候,可以根据需要来选择性的覆盖某些默认参数,以此来决定如何实例化对象.当一个对象有多个默认参数时,这个 ...

  9. cocos2dx中常见设计模式

    1.单例设计模式:导演类 2.观察者模式: 被观察者含有一个数组,里边存放了所有观察者的引用,在被观察者的状态发生改变的时候,通过调用观察者的函数来通知观察者,实现了信息的传递.  事件监听器:就是采 ...

  10. iOS 常见设计模式

    (一)代理模式/委托模式 应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现.优势:解耦合敏捷原则:开放-封闭原则实例:tableview的 数据源delegate,通过和 ...

随机推荐

  1. Java操作Excle(基于Poi)

    有一次有个同事问我会不会有java操作Excle,回答当然是不会了!感觉被嘲讽了,于是开始寻找度娘,找到个小例子,结果越写越有意思,最后就成就了这个工具类. import java.io.Buffer ...

  2. 和HTTP相关的web服务器内容

    一台web服务器可以搭建多个独立域名的网站,也可以作为通信路径上的中转服务器提升传输效率. 1. 用单台虚拟主机实现多个域名 多个域名解析后对应的ip地址相同,需要在Host首部中包含完整的主机名或者 ...

  3. java http接口请求响应 request response

    接口类: 1 package org.sunshine.dcda.epg.wechat.controller.niao; 2 3 import javax.servlet.http.HttpServl ...

  4. Dao设计模式简单实现

    一.什么是Dao设计模式 Dao设计模式封装了操作具体数据库的细节,对业务层提供操作数据库的接口,因此降低了业务层代码与具体数据库之间的耦合,有利于人员分工,增加了程序的可移植性. Dao设计模式中主 ...

  5. Linux系列之压缩与解压

    1.压缩技术 1.常用命令实例 1.zip格式的压缩与解压缩 zip是压缩指令,unzip是解压指令.zip指令既可以压缩文件,也可以压缩目录.压缩会自动保留源文件,解压会自动保留压缩文件. zip  ...

  6. C++编写DLL文件

    动态链接库DLL文件与EXE文件一样也是可执行文件,但是DLL也被称为库,因为里面封装了各种类.函数之类的东西,就像一个库一样,存着很多东西,主要是用来调用的.调用方式主要分为两种:隐式(通过lib文 ...

  7. NIPS2018最佳论文解读:Neural Ordinary Differential Equations

    NIPS2018最佳论文解读:Neural Ordinary Differential Equations 雷锋网2019-01-10 23:32     雷锋网 AI 科技评论按,不久前,NeurI ...

  8. docker 入门5 - 栈 【翻译】

    入门,第 5 部分:堆栈 先决条件 安装 Docker 版本 1.13 或更高版本. 获取第 3 部分先决条件中所述的 Docker Compose. 获取 Docker Machine,如第 4 部 ...

  9. Machine概念和获取帮助 【翻译】

    Machine概念和获取帮助 Docker Machine 允许您在各种环境中预配 Docker 计算机,包括驻留在本地系统.云提供商或裸机服务器(物理计算机)上的虚拟机.Docker Machine ...

  10. 1.DOS常用命令

    d:+ 回车:盘符切换,进入D:盘 dir(directory):列出当前目录下的文件及文件夹md(make director):创建目录rd(remove director):删除目录(不能删除非空 ...