常见的php模式
php中6种常见的设计模式
- 单例模式
- 观察者模式
- 策略模式
- 工厂模式
- 注册模式
- 适配器模式
单例模式
Db.php
<?php
/**
* 单例模式
*/
class Db
{
private static $instance=null;
//私有的构造方法防止外界实例化对象
private function __construct($className)
{ }
//私有的克隆方法防止克隆
private function __clone(){
}
//单例模式统一入口
public static function getInstance(){
if (!(self::$instance instanceof self))
{
self::$instance = new self();
}
return self::$instance;
}
}
?>
工厂模式
这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
工厂模式下可以设立多个子工厂,而不是所有的产品有单一的工厂来生产,而是给各自特色的子工厂来生产。
优点:
1、一个调用者想创建一个对象,只要知道其名称就可以了。
2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
3、屏蔽产品的具体实现,调用者只关心产品的接口。
<?php interface Transport{
public function go(); } class Bus implements Transport{
public function go(){
echo "bus每一站都要停";
}
} class Car implements Transport{
public function go(){
echo "car跑的飞快";
}
} class Bike implements Transport{
public function go(){
echo "bike比较慢";
}
} class transFactory{
public static function factory($transport)
{ switch ($transport) {
case 'bus':
return new Bus();
break; case 'car':
return new Car();
break;
case 'bike':
return new Bike();
break;
}
}
} $transport=transFactory::factory('car');
$transport->go();
策略模式:
策略模式定义了一系列的算法,并将每一个算法封装起来,使每个算法可以相互替代,使算法本身和使用算法的客户端分割开来,相互独立
优点:
(1)上下文和具体策略是松耦合关系。因此上下文只知道它要使用某一个实现Strategy接口类的实例,但不需要知道具体是哪一个类。
(2)策略模式满足“开-闭原则”。当增加新的具体策略时,不需要修改上下文类的代码,上下文就可以引用新的具体策略的实例。
<?php
interface jisuan{
public function way($a,$b);
}
class jiajisuan implements jisuan{
public function way($a,$b){
echo $a+$b;
}
}
class jianjisuan implements jisuan{
public function way($a,$b){
echo $a-$b;
}
}
class chengjisuan implements jisuan{
public function way($a,$b){
echo $a*$b;
}
}
class suanfa{
private $a;
private $b;
public $_obj;
public function __construct($a,$b){
$this->a=$a;
$this->b=$b;
}
public function caozuo($obj){
$this->_obj=new $obj;
return $this->_obj->way($this->a,$this->b);
}
}
$suanfa =new suanfa(,);
$suanfa->caozuo("chengjisuan");
?>
观察者模式
观察者模式(Observer),当一个对象的状态发生改变时,依赖他的对象会全部收到通知,并自动更新。
场景:一个事件发生后,要执行一连串更新操作.传统的编程方式,就是在事件的代码之后直接加入处理逻辑,当更新得逻辑增多之后,代码会变得难以维护.这种方式是耦合的,侵入式的,增加新的逻辑需要改变事件主题的代码
优点:
观察者模式实现了低耦合,非侵入式的通知与更新机制
<?php /**
观察者模式
定义一个接口实现两个方法
第一个方法进行注入初始化数组(传进去的参数是一个实例化后的对象数组比如猫对象)
数组内饰猫对象、狗对象、人对象
第二个方法进行通知因为传进来的是一个一维数组
遍历一维数组分别调用watch算法接受到通知
*/
/*定义观察者接口*/
interface aa{
public function watch();
}
/*实现观察者接口*/
class cat implements aa{
public function watch(){
echo "cat 已经收到";
}
}
class dog implements aa{
public function watch(){
echo "dog 已经收到";
}
}
class people implements aa{
public function watch(){
echo "people 已经收到";
}
}
/*定义bb接口*/
interface bb{
/*注册接口*/
public function register($obj);
/*同志接口*/
public function notify();
}
/*实现bb接口*/
class Action implements bb
{ public $_obj=[];
public function register($obj){
var_dump($obj);
$this->_obj[]=$obj;
}
public function notify(){
foreach($this->_obj as $ob){
$ob->watch();
}
}
}
$action=new Action();
$action->register(new cat());
$action->register(new dog());
$action->register(new people());
$action->notify();
?>
常见的php模式的更多相关文章
- [转载]五种常见的电子商务模式对比:B2B、B2C、C2B、C2C、O2O
转载自http://blog.sina.com.cn/s/blog_64e090b001016843.html 转载自http://blog.sina.com.cn/s/blog_64e090b001 ...
- 内存中 OLTP - 常见的工作负荷模式和迁移注意事项(三)
----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<In-Memory OLTP – Comm ...
- 内存中 OLTP - 常见的工作负荷模式和迁移注意事项(二)
----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<In-Memory OLTP – Comm ...
- 内存中 OLTP - 常见的工作负荷模式和迁移注意事项(一)
----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<In-Memory OLTP – Comm ...
- 五种常见的电子商务模式对比:B2B、B2C、C2B、C2C、O2O
电子商务模式是指企业运用互联网开展经营取得营业收入的基本方式,也就是指在网络环境中基于一定技术基础的商务运作方式和盈利模式.目前,常见的电子商务模式主要有B2B.B2C.C2B.C2C.O2O等几种, ...
- Android中常见的MVC模式
MVC模式的简要介绍 MVC是三个单词的缩写,分别为: 模型(Model),视图(View)和控制Controller). MVC模式的目的就是实现Web系统的职能分工. Model层实现系统中的业务 ...
- 解析C#开发过程常见的编程模式
单例模式: 在多线程的程序开发过程中经常会遇到单例模式[单件模式],它的特点是不是根据客户程序的调用而生成新的实例,而是控制某个类型的实例数量只有一个.也就是说,单例模式就是保证在整个应用程序的生命周 ...
- 模型-视图-控制器模式(MVC模式,10种常见体系架构模式之一)
一.简介: 架构模式是一个通用的.可重用的解决方案,用于在给定上下文中的软件体系结构中经常出现的问题.架构模式与软件设计模式类似,但具有更广泛的范围. 模型-视图-控制器模式,也称为MVC模式.是软件 ...
- Java常见23中设计模式之【代理模式】
一.静态代理模式 静态代理,使用继承的方式实现自己新增的服务 这种模式可以实现帮助被代理者完成一些前期的准备工作和后期的善后工作,但是核心的业务逻辑仍然是由被代理者完成. 在某些情况下,一个客户不想或 ...
随机推荐
- 点击事件target
1.场景:需要写一个弹出框来容纳登录界面,类似于百度的登录框 问题:使用 display: none/block 进行弹出框的显示和隐藏,设立点击事件 onclick 进行触发,但是点击 ...
- 内建函数之:reduce()使用
#!/usr/bin/python#coding=utf-8'''Created on 2017年11月2日 from home @author: James zhan ''' print reduc ...
- Windows和Linux下 Java开发ping工具类
package com.test.util; import java.io.BufferedReader; import java.io.IOException; import java.io.Inp ...
- Nginx源代码安装
1.确认系统平台及版本 [root@Trial html]# uname -r 2.6.32-696.6.3.el6.x86_64 [root@Trial html]# cat /etc/redhat ...
- 高级数据类型---元祖[tuple]
一.Tuple(元组)与列表类似,不同之处在于元组的 元素不能修改,让列表不可以被修改,以保护数据安全 元组 表示多个元素组成的序列 元组 在 Python 开发中,有特定的应用场景 用于存储 一串 ...
- AFNetworking 3.0简单数据请求get&post
/** *get请求方法 */ - (void)AFNGetUrl { AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; ...
- CMD命令,动态执行存储或DML命令
--exec master..xp_cmdshell CMD命令 --EXECUTE sys.sp_sqlexec 执行存储 --EXEC sp_executesql 执行DML语句
- Windows10 VS2017 C++使用crypto++库加密解密(AES)
参考文章: https://blog.csdn.net/tangcaijun/article/details/42110319 首先下载库: https://www.cryptopp.com/#dow ...
- 05_解决mac百度网盘下载速度慢问题
第一步:下载软件 下载工具包:aria2GUI和chrom插件 链接:https://pan.baidu.com/s/104t6aZXx9zfxBV9rS_eLfg 密码:yg96 ①下载Aria2 ...
- 框架tensorflow1
TensorFlow 1 分类: 1,protocol Buffer 处理结构化数据工具: (xml,json) 2,Bazel 自动化构建工具, 编译: tensor 张量: ...