单例模式的实现:

PHP中单例模式常用在数据库连接部分,省掉了大量的new操作进而节省了很多资源。单例模式还可以用在全局配置类中。

单例模式,顾名思义就是说只有一个实例,这就要求防止外部随意实例化对象。

PHP中单例模式的要点:

1、构造函数必须私有,防止外部非法new操作。

2、需要有一个私有静态的存放本类实例的类成员变量。

3、clone函数需要私有化,防止外部克隆。

4、有一个获取本类实例的公共的静态的方法。

代码如下:

<?php

/**
*PHP实现单例模式
*/
class Db
{
// 保存本类对象
private static $instance;
// 测试信息
private $message;
// 私有的构造函数
private function __construct($message) {
$this->message = $message;
}
// 防止被克隆
private function __clone() {}
// 获取本类实例的方法
public static function getInstance($message) {
if (! self::$instance instanceof self) {
self::$instance = new self($message);
}
return self::$instance;
}
public function getMessage() {
echo $this->message;
}
}
$db1 = Db::getInstance("我是第一个实例!");
$db1->getMessage();
echo "<br/>";
$db2 = Db::getInstance("我是第二个实例!");
$db2->getMessage(); ?>

运行结果如下:

我是第一个实例!
我是第一个实例!

观察者模式的实现:

观察者模式中主要存在两类对象,一个是主题(或者说是被观察者)和观察者,主题提供注册观察者和通知观察者的接口。

一个简单的使用场景是订票:

当订好车票时一般会伴随很多后续操作,比如:记录日志,短信通知,送积分等等。当主题改变时,在这就是订好票了,会通知观察者们进行相应操作,就是调用观察者的方法。

代码如下:

<?php

/**
*PHP实现观察者模式
*/ /* 主题接口 */
interface Subject
{
public function register(Observer $observer);
public function notify($type);
} /* 观察者接口 */
interface Observer
{
public function watch($type);
} /* 主题实现类 */
class Order implements Subject
{
public $_observers = array();
public function register(Observer $observer) {
$this->_observers[] = $observer;
}
public function notify($type) {
foreach($this->_observers as $observer) {
$observer->watch($type);
}
}
} /* 三个观察者实现类 */ class Log implements Observer
{
public function watch($type) {
echo "日志收到通知:$type<br/>";
}
} class Message implements Observer
{
public function watch($type) {
echo "短信收到通知:$type<br/>";
}
} class Reward implements Observer
{
public function watch($type) {
echo "奖励收到通知:$type<br/>";
}
} define('EVENT_ORDER', 1);
$order = new Order();
$order->register(new Log());
$order->register(new Message());
$order->register(new Reward());
$order->notify(EVENT_ORDER); ?>

运行结果:

日志收到通知:1
短信收到通知:1
奖励收到通知:1

最新文章

  1. bzoj1008快速面
  2. POJ1061青蛙的约会[扩展欧几里得]
  3. java访问ftp的一些操作
  4. TextBox的值是否为数字
  5. 创建FILE GEODATABASE 和栅格目录及向栅格目录中添加影像
  6. 利用WebApi获取手机号码归属地
  7. 解决R语言临时文件目录的问题(tempdir、tempfile)
  8. re 正则表达式
  9. 001 大数据情况下linux的配置
  10. IT 产品 需求 痛点
  11. TF模型训练中注意Loss和F1的变化情况
  12. Chargen UDP服务远程拒绝服务攻击漏洞修复教程
  13. Web标准:二、一列布局
  14. Python自动化之modelform和原生ajax
  15. install ros-indigo-map-server
  16. Java 8-lambda表达式及方法引用
  17. bzoj3961[WF2011]Chips Challenge
  18. Spring Boot @DeleteMapping
  19. Hive中日期函数总结
  20. 利用CXF框架开发webservice

热门文章

  1. Socket层实现系列 — connect()的实现
  2. 视音频编解码学习工程:JPEG分析器
  3. (四十二)tableView的滑动编辑和刷新 -局部刷新和删除刷新 -待解决问题
  4. Android Studio 从安装到配置使用
  5. jquery跳出当前的each循环的方式
  6. MySQL的一些常用的SQL语句整理
  7. unity使用UGUI创建摇杆
  8. 《java入门第一季》之面向对象(形式参数和返回值问题的深入研究3)
  9. Linux C OSS音频编程
  10. 【Android 应用开发】AndroidUI设计 之 图片浏览器