PHP常见设计模式
- 简单工厂
<?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常见设计模式的更多相关文章
- JavaScript 中常见设计模式整理
开发中,我们或多或少地接触了设计模式,但是很多时候不知道自己使用了哪种设计模式或者说该使用何种设计模式.本文意在梳理常见设计模式的特点,从而对它们有比较清晰的认知. JavaScript 中常见设计模 ...
- JS中常见设计模式总结
github: https://github.com/14glwu/FEInterviewBox/tree/master/JS%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F ...
- java之 ------ DAO设计模式的【具体解释】及常见设计模式的【应用】
DAO Data Access Object(数据訪问接口) 一.场景和问题 在Java程序中.常常须要把数据持久化,也须要获取持久化的数据.可是在进行数据持久化的过程中面临诸多问题(如:数据源 不同 ...
- JAVA设计模式简介及六种常见设计模式详解
一.什么是设计模式 ...
- Golang 常见设计模式之单例模式
之前我们已经看过了 Golang 常见设计模式中的装饰和选项模式,今天要看的是 Golang 设计模式里最简单的单例模式.单例模式的作用是确保无论对象被实例化多少次,全局都只有一个实例存在.根据这一特 ...
- 【Java基础】浅谈常见设计模式
Num1:单例模式 基本概念:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 常见写法: 懒汉式 public class Singleton { /* 持有私有静态实例,防止被引用,此处赋值 ...
- Javascript常见设计模式解析
设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性.毫无疑问,设计模式于己 ...
- Golang 常见设计模式之选项模式
熟悉 Python 开发的同学都知道,Python 有默认参数的存在,使得我们在实例化一个对象的时候,可以根据需要来选择性的覆盖某些默认参数,以此来决定如何实例化对象.当一个对象有多个默认参数时,这个 ...
- cocos2dx中常见设计模式
1.单例设计模式:导演类 2.观察者模式: 被观察者含有一个数组,里边存放了所有观察者的引用,在被观察者的状态发生改变的时候,通过调用观察者的函数来通知观察者,实现了信息的传递. 事件监听器:就是采 ...
- iOS 常见设计模式
(一)代理模式/委托模式 应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现.优势:解耦合敏捷原则:开放-封闭原则实例:tableview的 数据源delegate,通过和 ...
随机推荐
- 《你必须知道的495个C语言问题》读书笔记之第4-7章:指针
1. Q:为什么我不能对void *指针进行算术运算? A:因为编译器不知道所值对象的大小,而指针的算法运算总是基于所指对象的大小的. 2. Q:C语言可以“按引用传参”吗? A:不可以.严格来说,C ...
- 大白带你侃JAVA——封装的概述及好处
封装概述: 封装是指隐藏对象的属性和实现细节,仅对外提供公共访问方式 这是什么意思呢? 简单的来说就是我将不想给别人看的数据,以及别人无需知道的内部细节, "锁起来" ,我们只留下 ...
- 服务器TIME_WAIT和CLOSE_WAIT区别及解决方案
系统上线之后,通过如下语句查看服务器时,发现有不少TIME_WAIT和CLOSE_WAIT. netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) ...
- ORACLE initialization or shutdown in progress 错误解决办法
第一步,运行cmd 第一步.sqlplus /NOLOG第二步.SQL>connect sys/change_on_install as sysdba'/提示:已成功第三步.SQL>shu ...
- 用命令将本地项目上传到git
1.(先进入项目文件夹)通过命令 git init 把这个目录变成git可以管理的仓库 git init 2.把文件添加到版本库中,使用命令 git add .添加到暂存区里面去,不要忘记后面的小数点 ...
- 码云以及Git的使用
码云以及Git的使用 码云就是一个远程管理的仓库,Git是用来上传和下载数据的工具. 首先访问网站 https://gitee.com/ 进行注册 注册完成后,进入如下页面 点击新建仓库 设置自己的仓 ...
- MySQL反应慢排查思路
数据库异常假死排查需要数据(当时问题的时间,前后时间在2个小时的数据就行) 1.MySQL相关配置 整体可以借助于pt-mysql-summary生成(percona-tools工具) 2.操作系统方 ...
- 怎样通过html标签名获取元素节点集合
方法1. 使用document.querySelectorAll(); 方法2. 使用document.getElementsByTagName(); document.querySelectorAl ...
- 作业1:java虚拟机内存模型图示
看了很多篇文章,整理成一幅图,但仍然有许多不解的地方,以后再接着完善,哪位大神看到不正确的地方,请指出,谢谢.
- gperftools源码分析和项目应用 - CPU Profiler
gperftools源码分析和项目应用 - CPU Profiler 原文:https://blog.csdn.net/yubo112002/article/details/81076821 原文链接 ...