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 个常见的模式 本文的 ...
随机推荐
- 模拟jQuery中的ready方法及实现按需加载css,js
一.ready函数的实现 经常用jQuery类库或其他类库中的ready方法,有时候想想它们到底是怎么实现的,但是看了一下jQuery中的源码,涉及到的模块比较多,(水平有限)代码比较难看懂:自己结合 ...
- [转载]在Windows下搭建Android开发环境
http://jingyan.baidu.com/article/bea41d437a41b6b4c51be6c1.html 在Windows下搭建Android开发环境 | 浏览:30780 | 更 ...
- ASP.NET中最简单的自定义控件
ASP.NET用户控件一般适用于产生相对静态的内容,所以没有builtin的事件支持.本文讨论用户控件返回事件的方法. 假定用户控件(UserControl.ascx)中包含按钮控件 ...
- Angular 下的 directive (part 1)
directive 指令 Directive components 指令部分 使用指令自动引导一个AngularJS应用.ngApp指令指定应用程序的根元素,通常是放在页面的根元素如: < ...
- js和jquery使按钮失效为不可用状态的方法
设置disabled属性为true即为不可用状态. html代码: <input type="button" value="提交" id="bt ...
- [HNOI2013]比赛 (用Hash实现记忆化搜索)
[HNOI2013]比赛 题目描述 沫沫非常喜欢看足球赛,但因为沉迷于射箭游戏,错过了最近的一次足球联赛.此次联 赛共N支球队参加,比赛规则如下: (1) 每两支球队之间踢一场比赛. (2) 若平局, ...
- 【转】深入理解C++中public、protected及private用法
首先明白以下两点: 1.类的一个特征就是封装,public和private作用就是实现这一目的. 即:用户代码(类外)可以访问public成员而不能访问private成员:private成员只能由类成 ...
- 测试开发之Django——No1.介绍以及引申
前言 > 测试行业发展飞速,自动化测试兴起,由此对测试人员的要求与日俱增.随时而来的,就是职能的增加. > 首先需要学习的,就是自动化测试.而由自动化测试引申而来的,就是另外几个新增的岗位 ...
- 动态规划(dp)专题
航线设置 问题描述在美丽的莱茵河畔,每边都分布着N个城市,两边的城市都是唯一对应的友好城市,现需要在友好城市间开通航线以加强往来,但因为莱茵河常年大雾,如果开设的航线发生交叉就有可能出现碰船的现象 ...
- CentOS 6 安装chromium
由于centos 6对C++11支持不足的缘故,目前chromium已经不再支持CentOS 6系列. 这里介绍如何在centos 6系列安装chromium. 1.添加chromium源 cd /e ...