PHP常用设计模式
1、单例模式指在整个应用中只有一个对象实例的设计模式
class Single {
public $rand;
static private $instance; // 类直接调用
final private function __construct() { // private防止外部new
$this->rand = mt_rand(1, 100);
}
static public function getInstance() {
if (!self::$instance) { // 判断$instance是否赋值
self::$instance = new self;
}
return self::$instance;
}
}
$obj1 = Single::getInstance();
$obj2 = Single::getInstance();
var_dump($obj1 === $obj2); // true
2、工厂模式指通过工厂类调用自身静态方法来生产对象实例的设计模式
//接单例模式代码
class FactoryClass {
static public function factory() {
return Single::getInstance();
}
}
var_dump(FactoryClass::factory());
3、注册器模式指将对象注册到全局树上,可直接设置获取注销对象
class Register {
static protected $objects; //全局树array
static public function set($alias, $object) {
self::$objects[$alias] = $object; //设置
}
static public function get($alias) {
return self::$objects[$alias]; //获取
}
static public function _unset($alias) {
unset(self::$objects[$alias]); //注销
}
}
Register::set('rand', FactoryClass::factory()); //设置别名为rand的对象
var_dump(Register::get('rand')); //获取别名为rand的对象
Register::_unset('rand'); //销毁别名为rand的对象
var_dump(Register::get('rand')); //Notice: Undefined index: rand
4、适配器模式指将一个类的接口转换成客户期望的另一个类的接口,让原本接口不兼容的类合作无间。
适配器分为类适配器和对象适配器,类适配器采用“多继承”的实现方式,导致不良的高耦合,对象适配器采用“对象组合”的方式,更符合松耦合精神。
4.1 类适配器
//类适配器使用的是继承
/**
* 目标
*/
interface Target {
public function method1(); //源类也有的方法1
public function method2(); //源类没有的方法2
} /**
* 源
*/
class Source {
public function method1() {
echo '我是源类含有的方法一 <br>';
}
} /**
* 类适配器
*/
class Adapter extends Source implements Target {
public function method2() {
echo '我是适配器补充的方法二 <br>';
}
} /**
* 客户端
*/
class Client {
static public function main() {
$adapter = new Adapter();
$adapter->method1();
$adapter->method2();
}
}
Client::main();
4.2 对象适配器
//类适配器使用的是继承
/**
* 目标
*/
interface Target {
public function method1(); //源类也有的方法1
public function method2(); //源类没有的方法2
} /**
* 源
*/
class Source {
public function method1() {
echo '我是源类含有的方法一 <br>';
}
} /**
* 类适配器
*/
class Adapter implements Target {
private $_source;
public function __construct(Source $source) {
$this->_source = $source;
}
public function method1() { //委派调用source的method1方法
$this->_source->method1();
}
public function method2() { //补充source中没有的method2方法
echo '我是适配器补充的方法二';
}
}
class Client {
static public function main() {
$adapter = new Adapter(new Source);
$adapter->method1();
$adapter->method2();
}
}
Client::main();
//我是源类含有的方法一
//我是适配器补充的方法二
5、观察者模式指当一个对象的状态发生改变时,依赖他的对象会全部收到通知,并自动更新。
/**
* 主题接口
*/
interface Subject {
public function register(Observer $observer); //注册对象方法
public function notify(); //通知方法
}
/**
* 观察者接口
*/
interface Observer {
public function update();
}
/**
* 执行类
*/
class Action implements Subject {
private $_observers = array();
public function register(Observer $observer) {
$this->_observers[] = $observer; //对象写入
}
public function notify() {
foreach ($this->_observers as $observer) { //遍历对象
$observer->update();
}
}
}
/**
* 观察者
*/
class Man implements Observer {
public function update() {
echo 'man观察者<br>';
}
}
class Woman implements Observer {
public function update() {
echo 'woman观察者';
}
}
$action = new Action();
$action->register(new Man);
$action->register(new Woman);
$action->notify();
PHP常用设计模式的更多相关文章
- Android常用设计模式(二)
Android常用设计模式之观察者模式 观察者设计模式在Android应用中会经常用到,模式原理类似于这样的场景: 用户订报纸,然后在报社登记,报社来统计用户(添加用户),用户也可以取消订阅,报社删除 ...
- 代码重构 & 常用设计模式
代码重构 重构目的 相同的代码最好只出现一次 主次方法 主方法 只包含实现完整逻辑的子方法 思维清楚,便于阅读 次方法 实现具体逻辑功能 测试通过后,后续几乎不用维护 重构的步骤 1 新建一个方法 ...
- IOS开发常用设计模式
IOS开发常用设计模式 说起设计模式,感觉自己把握不了笔头,所以单拿出iOS开发中的几种常用设计模式谈一下. 单例模式(Singleton) 概念:整个应用或系统只能有该类的一个实例 在iOS开发我们 ...
- python之路,Day24 常用设计模式学习
python之路,Day24 常用设计模式学习 本节内容 设计模式介绍 设计模式分类 设计模式6大原则 1.设计模式介绍 设计模式(Design Patterns) --可复用面向对象软件的基础 ...
- java常用设计模式总览
一.java的设计模式大体上分为三大类: 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式. 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组 ...
- javaEE Design Patter(1)初步了解23种常用设计模式
设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. ...
- PHP 进阶篇:面向对象的设计原则,自动加载类,类型提示,traits,命名空间,spl的使用,反射的使用,php常用设计模式 (麦子学员 第三阶段)
以下是进阶篇的内容:面向对象的设计原则,自动加载类,类型提示,traits,命名空间,spl的使用,反射的使用,php常用设计模式 ================================== ...
- C++源码实现:21种常用设计模式
C++源码实现:21种常用设计模式一直以来在设计模式的学习中,都是出现java的源码,这对学习C++的极度不友好.本工程是基于C++实现21种常用的设计模式,里面包含了实例代码和示例.编写的时候在学习 ...
- 23种常用设计模式的UML类图
23种常用设计模式的UML类图 本文UML类图参考<Head First 设计模式>(源码)与<设计模式:可复用面向对象软件的基础>(源码)两书中介绍的设计模式与UML图. 整 ...
- 7 种 Javascript 常用设计模式学习笔记
7 种 Javascript 常用设计模式学习笔记 由于 JS 或者前端的场景限制,并不是 23 种设计模式都常用. 有的是没有使用场景,有的模式使用场景非常少,所以只是列举 7 个常见的模式 本文的 ...
随机推荐
- 如何使用ASP.NET开发基于推技术的聊天室?
public class Content : System.Web.UI.Page{private void Page_Load(object sender, System.EventArgs e){ ...
- 爬虫笔记之自如房屋价格图片识别(价格字段css背景图片偏移显示)
一.前言 自如房屋详情页的价格字段用图片显示,特此破解一下以丰富一下爬虫笔记系列博文集. 二.分析 & 实现 先打开一个房屋详情页观察一下: 网页的源代码中没有直接显示价格字段,价格的显示是使 ...
- GBDT理解
一.提升树 提升方法实际采用加法模型(即基函数的线性组合)与前向分布算法.以决策树为基函数的提升方法称为提升树,boosting tree.对分类问题的决策树是二叉分类树,对回归问题的决策树是二叉回归 ...
- Linux下内存泄漏工具【转】
转自:http://www.cnblogs.com/guochaoxxl/p/6970090.html 概述 内存泄漏(memory leak)指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况 ...
- mysql+mycat压力测试一例【转】
前言 有很多人担心生产系统上新东西的程序怕压力跟不上和稳定性不行,是的,大家都怕,所以领导要求做一次压力测试,我个人也觉得是有必要的. 如果按原理来说,mycat如果不做分片,纯粹只是代理的话,他所做 ...
- 001_chrome工具详解
一.chrome https://segmentfault.com/a/1190000000683599
- django-xadmin后台开发
先通过pip命令行安装django<=1.9版本 示例:pip install django==1.9 从https://github.com/sshwsfc/xadmin下载xadmin源码解 ...
- 2011TG初赛
一.单项选择题(共20题,每题1.5分,共计30分,每题有且仅有一个正确选项.) 1. 在二进制下,1011001+( )=1100110. A.1011 B.1101 C.1010 D.1111 B ...
- SecureCRT中常用linux命令 -《转载》
常用命令: 一.ls 只列出文件名 (相当于dir,dir也可以使用) -A:列出所有文件,包含隐藏文 件. -l:列表形式,包含文件的绝大部分属性. -R:递归显示. --help:此命令的帮助. ...
- Grafana 短信报警
一.分析 需求 Grafana支持短信渠道报警 要求 使用开发提供的短信API接口 请求url: http://192.168.1.1:8088/alerting/sendSms?mobile=手机号 ...