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,通过和 ...
随机推荐
- windows远程重启
用管理员权限打开win+r,输入cmd后: net use \ip地址 "管理员密码" /user:administrator shutdown /r /t 0 /m ip地址 即 ...
- P2279 消防局的设立 (树形DP or 贪心)
(点击此处查看原题) 树形DP写法 看到这个题的要求,很容易相到这是一个树形DP的问题,但是dp数组应该如何设计并转移才是关键 dp[i][0]代表当前结点可以向上覆盖2层,自身一定被覆盖dp[i][ ...
- Scrapy里Selectors 四种基础的方法
在Scrapy里面,Selectors 有四种基础的方法xpath():返回一系列的selectors,每一个select表示一个xpath参数表达式选择的节点css():返回一系列的selector ...
- 简单使用setup.py来安装Python项目
最近做个一个项目需要用到setup.py 这个构建工具来进行项目的便捷安装,把搜集到的一些资料加上个人理解整理成文章,如有错误的地方请各位大佬及时指出,小弟马上修改,下面正式进入setup.py的描述 ...
- Python http.server中获取Post的请求报文
今天在自学http.server请求命令, 各个字段都很好理解, 但唯独想打印获取Post请求报文时, 被难住了, 网上找了很多帖子, 官方的文档也刷了几遍, 但没有一个明确的答复. 后来不经意间看到 ...
- 怎样在微信H5中点击直接跳转到公众号
第一步: 打开微信公众号, 随便找一篇公众号文章, 将它发送给你的某个好友. 第二步: 使用默认浏览器打开这个分享的文章链接, 然后复制链接里面的biz字段到下面这个URL中替换 第三步: 在html ...
- hdu 6045 多校签到题目
http://acm.hdu.edu.cn/showproblem.php?pid=6045 题解:遍历一遍,求出两个人答案中相同的个数,用wa表示.然后我从大的数入手,当wa的数都尽可能在两个人答案 ...
- According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by de
MySQL在高版本需要指明是否进行SSL连接 spring.datasource.url=jdbc:mysql://127.0.0.1:3306/framework?characterEncoding ...
- Python实现字符的冒泡排序——说实话,两个数兑换的方法震惊了我,一天比一天感受到了Python的强大
import random M= lettList=[] for i in range(M): lettList.append(chr(random.randrange(,))) for lett i ...
- 微信小程序在组件中获取界面上的节点信息wx.createSelectorQuery
节点信息查询 API 可以用于获取节点属性.样式.在界面上的位置等信息. 最常见的用法是使用这个接口来查询某个节点的当前位置,以及界面的滚动位置. 示例代码: const query = wx.cre ...