• 简单工厂
<?php
# 简单工厂
abstract class mycoach
{
public function __construct(){}
} class cultivatecpc extends mycoach{
public function __construct(){
echo "把陈培昌培养为搏击教练"."\n";
}
} class cultivatecj extends mycoach{
public function __construct(){
echo "把程劲培养为搏击教练"."\n";
}
} class martialclub
{
public function cultivate($name)
{
switch($name){
case 'cj':
return new cultivatecj();
case 'cpc':
return new cultivatecpc();
default:
echo '培养一个小教练'."\n";
break;
}
return null;
}
}
class clubmaster{
public function cultivate()
{
$myclub = new martialclub();
$myclub->cultivate('cj');
$myclub = new martialclub();
$myclub->cultivate('cpc');
}
} $mymaster = new clubmaster();
$mymaster->cultivate();

输出结果:

把程劲培养为搏击教练
把陈培昌培养为搏击教练
  • (复杂)工厂
<?php
abstract class mycoach
{
public function __construct()
{}
} class cpc extends mycoach
{
public function __construct()
{
echo "培养出了搏击教练昌仔"."\n";
}
} class cj extends mycoach
{
public function __construct()
{
echo "培养出了搏击教练劲儿弟弟"."\n";
}
} interface cultivate{
function cultivate();
} class cultivatecpc implements cultivate
{
public function cultivate()
{
return new cpc();
}
} class cultivatecj implements cultivate
{
public function cultivate()
{
return new cj();
}
} class coach{
public function __construct()
{
$coach = new cultivatecpc();
$coach->cultivate(); $coach = new cultivatecj();
$coach->cultivate();
}
} $littlecoach = new coach();

输出结果:

培养出了搏击教练昌仔
培养出了搏击教练劲儿弟弟
  • 观察者模式
<?php
class watcher
{
private $name;
public function __construct($myname){
$this->name=$myname;
}
public function update($food)
{
switch($food)
{
case '奶油蛋糕':
echo $food."上桌了,".$this->name.'取出了一份纸盘子和塑料叉子,切了一块'."\n";
break;
case '烤鸭':
echo $food."上桌了,".$this->name.'取了张薄饼,夹了些许葱丝,刷了些甜面酱'."\n";
break;
default:
echo $food."上桌了,".$this->name."赶紧加了两筷子"."\n";
break;
}
return null;
}
} class watchee
{
private $watchlist = [];
public function addwatcher($watcher)
{
$this->watchlist[]=$watcher;
}
public function removewatcher($watcher)
{
$target = array_search($watcher,$this->watchlist);
$target = (int)$target;
unset($this->watchlist[$target]);
//echo $target."\n";
}
public function loaddish($dishname)
{
$this->notify($dishname);
}
public function notify($dishname)
{
      #这里推荐用foreach循环,for循环带来的陷阱是,如果以数字为索引,执行removewatcher方法后,有些索引就没了,访问不到就会报错
    foreach($this->watchlist as $k=>$v)
{
$this->watchlist[$k]->update($dishname);
}
} } $cpc = new watcher('陈培昌');
$cj = new watcher('程劲');
$observee = new watchee();
$observee->addwatcher($cpc);
$observee->addwatcher($cj);
$observee->loaddish('葱香四川凉面');
$observee->removewatcher($cj);
$observee->loaddish('奶油蛋糕');
$xxd = new watcher('徐晓冬');
$observee->addwatcher($xxd);
$observee->loaddish('避风塘茄子');

输出结果:

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

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. UWP 保存音乐或视频缩略图图片到本地

    开发项目时,有时需要将本地媒体文件的缩略图保存到本地,下面是源码. 需要打开Package.appxmanifest 功能 图片库 访问权限. <Page x:Class="SaveB ...

  2. 关于SQLSERVER登录不了的情况

    是这样的,本人为了复制一个数据库文件把默认数据库设置成了脱机状态.在此点击联机的时候SSMS显示重启,重启后在用windows登录显示无法打开默认数据库.用其他不适该默认数据库的账号可以登录.想问一下 ...

  3. 利用js对象将iframe数据缓存, 实现子页面跳转后, 返回时不丢失之前填写的数据

    利用js对象将iframe数据缓存, 实现子页面跳转后, 返回时不丢失之前填写的数据 实现描述:将数据存放在js对象中, 然后放在父页面的document对象中, 在页面刷新的时候将父页面的值取出来, ...

  4. java日志框架系列(3):logback框架配置详解

    1.Logback配置 1.配置步骤及默认配置 logback即可以通过编程式配置,也可以通过xml的形式配置. logback配置步骤: 1. 尝试在 classpath 下查找文件 logback ...

  5. varchar、nvarchar

    Unicode字符集就是为了解决字符集这种不兼容的问题而产生的,它所有的字符都用两个字节表示,即英文字符也是用两个字节表示. NCHAR.NVARCHAR.NTEXT.这三种从名字上看比前面三种多了个 ...

  6. [Tarjan系列] Tarjan算法求无向图的双连通分量

    这篇介绍如何用Tarjan算法求Double Connected Component,即双连通分量. 双联通分量包括点双连通分量v-DCC和边连通分量e-DCC. 若一张无向连通图不存在割点,则称它为 ...

  7. select into from与insert into select区别

    创建一个table2  向table2中插入 table1中name为11的所有行(前提table2不存在) select * into table2 from table1 where name=‘ ...

  8. 9-MySQL DBA笔记-测试实践

    第9章 测试实践 在第8章中介绍了测试所需要的理论知识,本章将为读者讲述实际的测试过程.实际测试一般包括硬件测试.MySQL基准测试及应用服务压力测试,下面将分别讲述这三方面的内容.此外,测试工具的选 ...

  9. Java建造者模式(思维导图)

    图1 建造者模式[点击查看大图] 基本的知识点已在思维导图中,下面是demo 1,Builder 为创建一个产品对象的各个部件指定抽象接口 public interface PersonBuilder ...

  10. SpringBoot的数据访问

    一.JDBC方式 引入starter. <dependency> <groupId>org.springframework.boot</groupId> <a ...