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 个常见的模式 本文的 ...
随机推荐
- 使用data:uri上传图片
上传图片的方式有两种,一种是使用传统的html控件的方式,设置form属性为multipart/form-data.这种方式兼容ie6,ie7.另一种方式是使用data:uri,将base64编码从浏 ...
- Linux - sed 常用操作
sed 文本常用操作方式 sed 10q # 显示文件中的前10行 (模拟"head") sed -n '$=' # 计算行数(模拟 "wc -l") sed ...
- 灵活、可高度自定义的——Progress进度圈、弹窗、加载进度、小菊花
DDProgressHUD的介绍 提供了四种类型的展示: 显示无限旋转的加载图(比如小菊花,可以自定义),显示文字信息.网络刷新时经常用到. 显示加载进度的动画,也可以显示文字.网络下载时用的比较多, ...
- JS种this的四种用法
记住以下四点: 1.没调用对象就指向全局对象 2.有对象就指向调用对象 3.用new构造就指向新对象 4.通过 apply 或 call 或 bind 来改变 this 的所指. 1.测试一:没调用对 ...
- slf4j MDC使用
slf4j MDC使用 最近也是在项目代码里发现一个地方有个MDC.put(),忍不住好奇点了进去,于是知道了MDC这个东西,细研究一下,发现还真是个好东西. MDC解决了什么问题 MDC全名Mapp ...
- wpf 如果列表加载超多数据变的卡顿时,使用VirtualizingStackPanel
如果列表加载超多数据变的卡顿时 <ListBox > <ItemsControl.ItemsPanel> <ItemsPanelTemplate> <Virt ...
- linux诡异的硬盘不足
phpmyadmin页面登录不进去,ftp也连不上.而服务端的service都开着的.直觉是看一下硬盘使用情况. df -TH 发现可用空间几乎为0 但是查看各个目录使用情况: du -sh /* | ...
- Codeforces Round #530 (Div. 2) F - Cookies
F - Cookies 思路:我们先考虑如何算出在每个节点结束最多能吃多少饼干, 这个dfs的时候用线段树维护一下就好了, 然后有个这个信息之后树上小dp一下就好啦. #include<bits ...
- spark优化之临时目录
官方是这样说的: Directory to use for "scratch" space in Spark, including map output files and RDD ...
- 020 shuffle的重要作用,以及分区的实践
一:学shuffle原理的必要性 1.说明 学习shuffle的作用是可以对程序进行优化. 在shuffle这个部分有三个部分需要注意: 分区 排序 分组 这个可以进行优化. 二:分区的实践 1.说明 ...