单例模式的实现:

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. 仿iphone快速导航悬浮球

    用过iphone的朋友都知道,iPhone有个圆球辅助工具,它漂浮在你的手机屏幕(在任何APP之上),你可以将它移动到任何地方,它叫做AssistiveTouch,本篇模拟该软件实现一个小案例,主要是 ...

  2. UNIX环境高级编程——线程同步之读写锁以及属性

    读写锁和互斥量(互斥锁)很类似,是另一种线程同步机制,但不属于POSIX标准,可以用来同步同一进程中的各个线程.当然如果一个读写锁存放在多个进程共享的某个内存区中,那么还可以用来进行进程间的同步, 互 ...

  3. 连接器与容器的桥梁——CoyoteAdapter

    如果把整个tomcat内核最高抽象程度模块化,可以看成是由连接器Connector和容器Container组成,连接器负责HTTP请求接收及响应,生成请求对象及响应对象并交由容器处理,而容器则根据请求 ...

  4. PHP与JavaScript在处理数组方面的不同之处

    数组在编程的时候是经常被使用到的一种数据结构,然而在不同的编程语言中是引用方法大同小异,下面来看一看数组元素在PHP与JavaScript中有什么不同吧. 以遍历数组元素为例: 1.在PHP中, // ...

  5. Linux的启动流程 (二)

    引:本文以RedHat9.0和i386平台为例,剖析了从用户打开电源直到屏幕出现命令行提示符的整个Linux启动过程.并且介绍了启动中涉及到的各种文件.阅读Linux源代码,无疑是深入学习Linux的 ...

  6. Python学习笔记 - 字符串和编码

    #!/usr/bin/env python3 # -*- coding: utf-8 -*- #第一行注释是为了告诉Linux/OS X系统, #这是一个Python可执行程序,Windows系统会忽 ...

  7. Linux 进程等待队列

    Linux内核的等待队列是以双循环链表为基础数据结构,与进程调度机制紧密结合,能够用于实现核心的异步事件通知机制. 在这个链表中,有两种数据结构:等待队列头(wait_queue_head_t)和等待 ...

  8. C语言所有作业练习题

    2015.08.11 1.计算十进制 42 转换为二进制.八进制.十六进制分别对应的值 2.计算二进制 11010110 对应的十进制值 3.计算八进制 075 对应的十进制值 4.计算十六进制 0x ...

  9. 漫谈程序员(十八)windows中的命令subst

    漫谈程序员(十八)windows中的命令subst 用法格式 一.subst [盘符] [路径]  将指定的路径替代盘符,该路径将作为驱动器使用 二.subst /d 解除替代 三.不加任何参数键入  ...

  10. 集群通信组件tribes之集群的消息接收通道

    与消息发送通道对应,发送的消息需要一个接收端接收消息,它就是ChannelReceiver.接收端负责接收处理其他节点从消息发送通道发送过来的消息,实际情况如图每个节点都有一个ChannelSende ...