单例模式的实现:

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

PHP实现单例模式和观察者模式的更多相关文章

  1. (原创)c++11改进我们的模式之改进单例模式

    我会写关于c++11的一个系列的文章,会讲到如何使用c++11改进我们的程序,本次讲如何改进我们的模式,会讲到如何改进单例模式.观察者模式.访问者模式.工厂模式.命令模式等模式.通过c++11的改进, ...

  2. iOS,几种设计模式

    1.单例模式 2.观察者模式 3.委托代理 4.block回调 5.反射机制 单例模式 iOS单例模式的2种方式.根据线程安全的实现来区分,一种是使用@synchronized ,另一种是使用GCD的 ...

  3. java程序员修炼之道

    今天在论坛里看到了一位工作10年的java大牛总结的java程序员修炼之道,看完后给出的评价是:字字玑珠,深入人心,猛回头,自己一无是处··· 大牛告诉我们应该好好学习与修炼以下知识与技能 Java语 ...

  4. Java设计模式论述

    为何须要设计模式: 模式是做事的方法,是实现目标,研磨技术的方法.这样的对高效技术不懈追求的思想,广泛见于诸多领域,比如制作精美佳肴的过程.对于不论什么一种迈向成熟的全新技艺,身处这个行业的人都须要寻 ...

  5. 【闲聊PHP】编程界的萝莉小美女--PHP

    本文地址 01 前言--上了贼船 不知道何时就上了PHP的贼船了,开始了web的开发,记得差不多两年前我还是做传统电子行业的人,就是嵌入式的方向,那时在天津或摆弄手机,或下煤窑摆弄电话,抑或就是在医疗 ...

  6. Java设计模式之职责型模式总结

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6548127.html 所谓职责型模式,就是采用各种模式来分配各个类的职责. 职责型模式包括 ...

  7. Java软件系统功能设计实战训练视频教程

    Java软件系统功能设计实战训练视频教程 第01节课:整体课程介绍和杂项介绍第02节课:软件功能设计常见理念和方法第03节课:关于软件设计的一些思考第04节课:第一周作业的业务和相应模式:综合应用简单 ...

  8. 转载 Java设计模式

      java常用设计模式 1.strategy(策略模式)2.static Factory Method(静态工厂)3.singelton(单例模式)4.观察者模式(Observer)5.迭代器模式( ...

  9. 第二单元电梯调度作业 By Wazaki

    figure:first-child { margin-top: -20px; } #write ol, #write ul { position: relative; } img { max-wid ...

随机推荐

  1. UNIX环境高级编程——Linux系统调用列表

    以下是Linux系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的的函数.这可能是你在互联网上所能看到的唯一一篇中文注释的Linux系统调用列表,即使是简单的字母序英文列表,能做到这么完 ...

  2. iOS学习新知识-加速计和陀螺仪

    一.CoreMotion框架介绍 我们知道有一些iOS的应用,会有一些特殊的要求,比如: 电子罗盘指南针之类的应用:让我们知道方向. 运动类型软件:让我们知道我们跑步多少公里. 社交软件中的摇一摇功能 ...

  3. Gitflow工作流程

    在工作场合实施Git的时候,有很多种工作流程可供选择,此时反而会让你手足无措.本文罗列了企业团队最常用的一些Git工作流程,包括Centralized Workflow.Feature Branch ...

  4. Android移动后端服务(BAAS)快速搭建后台服务器之Bmob-android学习之旅(75)

    个人移动开发者的最头疼的问题,就是App的网络后台,包含数据库等,国外目前有比较成熟的解决方案,但是限制于墙的问题,推荐国内的解决方案,比较出名的是Bmob和AVOS cloud和Atom等,这一次我 ...

  5. (八)喜马拉雅Demo引出的细节(代理模式和图片缩放)

    喜玛拉雅是一款电台APP,界面非常美观,通过模仿这一APP学习到很多细节. 1.图片导入后有些框内不全如何补全: 寻常的办法是再准备一张图片拖入,比较好的办法是右击已经导入的图片选择Show in F ...

  6. [FreeRadius2]遇到问题记录

    在学习FreeRadius2中遇到的问题,和解决. 使用的是2.2 版本,测试的系统是Centos6.7 radtest 没有响应 radiusd 启动正常,测试如下命令不好使 [root@orang ...

  7. hadoop学习视频

    杨尚川的视频 http://www.tudou.com/plcover/EvJCo2zl9hQ/ 酷6视频 http://v.ku6.com/show/8PkgqGcarHKndyP3rl_pUw.. ...

  8. Swing组件 创建窗口应用

    package com.swing; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt. ...

  9. 开源框架VTMagic的使用介绍

    VTMagic 有很多开发者曾尝试模仿写出类似网易.腾讯等应用的菜单分页组件,但遍观其设计,大多都比较粗糙,不利于后续维护和扩展.琢磨良久,最终决定开源这个耗时近两年打磨而成的框架,以便大家可以快速实 ...

  10. 队列顺序存储 - 设计与实现 - API函数

    队列是一种特殊的线性表 队列仅在线性表的两端进行操作 队头(Front):取出数据元素的一端 队尾(Rear):插入数据元素的一端 队列不允许在中间部位进行操作! queue常用操作 销毁队列 清空队 ...