PHP 常用设计模式 总结

PHP常用设计模式有

工厂模式

具体实现原理:通过创建一个工厂类,再类里定义N个static 函数,每个函数分别负责生成一个static的类

作用:防止一个对象多处new

代码试图:

Class Factory{  

private static $X;

static function createX(){

if( $X){ return $X; } 

else{

$X= new X();

self::$X = $X;

return self::$X;

}

}

static function createY(){}

...... 

}

单例模式

具体实现原理:通过static修饰下类或者属性或者方法即可

作用:一个类只能new一次,这样一个方法或者属性在内存中只有一个备份

代码视图:static function,static $x...............

寄存器模式

作用:把被寄存的对象,函数 等 作全局函数存储起来,方便各个地方调用

代码视图:

class Register{

private static $arr = array();

static function set($arias,$obj){

self::$arr[$arias] = $obj;

}

static function get($arias){

return  self::$arr[$arias] ;

}


}

适配器模式

具体实现原理:定义一个适配器模型(通过定义一个接口类),再具体创建N个适配器(各个实现该接口的类都是符合这个适配器模型)

作用:方便维护,不需要再去改类的方法,只要根据需要修改类名就可以了

interface Car{

function call();

function openDoor();

}

class SmallCar implements Car{

function call(){

......

}

function openDoor(){

...............

}

}

class BigCar implements Car{

function call(){

......

}

function openDoor(){

...............

}

}


策略模式

具体实现原理:先定义一个策略模型(创建一个接口类),,实现N个策略(每个实现该策略模型的类都是一个具体的策略模式),然后在具体的业务逻辑里,定义一个策略入口类,里面只要创建一个 设置策略的方法,就可以免去很多if,else,else if的判断了

作用:方便维护,减少if,else的判断

代码视图:

interface IStrategy{

interffac show add();

}

class FemalStrategy implements IStrategy{

function show add(){

echo "show 男装";

}

}

class WomanStrategy implements IStrategy{

function show add(){

echo "show 女装";

}

}


class Strategy{

private $strategy;

function set($stragtegy){ //通过这个方法,解决了硬编码带来的维护性问题

$this->strategy = $strategy;

}

function showadd(){

$strategy->showadd();

}

}

业务代码

比如这里是女装显示

$woman=new WomanStrategy();

$m=new Strategy();

$m->set($woman);

$m->showad();


数据对象映射模式

具体实现原理:创建一个Model类,这个类的__construct 方法负责获取,___destruct方法负责更新

作用:减少代码耦合性,view是图层只关心的是对对象属性的修改就 可以映射到数据库表

代码视图:

class User{

private $name;

private $age;

private $id;

function __construct($id){

//获取$id数据信息,然后为age,name赋值

}

function __destruct(){

//修改$id这条数据的信息

}

}

View层

$user= new User(1);

$user->age = "修改后的age";

$user->name = "修改后的name";


刷新页面,我们会发现当$user被销毁的时候,就会执行User类的析构函数


观察者模式

具体实现原理:创建一个抽象类负责添加观察者,和通知所有观察者,创建一个N个观察者,这里采用统一的实现所以用接口进行规范各个观察者类,实现行为一致。

作用:方便代码扩展,方便维护,可以随时修改哪个事件增加或者取消

代码视图

Event.php

class Event extends  \Controller\EventObserver{
function startEvent(){
echo "start<br/>";
$this->notify();
}
}
class Observer1 implements  \Controller\Observer{
public function update($eventInfo=null){
echo "Observ1 know<br/>";
}
}
class Observer2 implements  \Controller\Observer{
public function update($eventInfo=null){
echo "Observ2 know<br/>";
}
}


//触发事件
$ev=new Event();
$ev->addObserver(new Observer1());
//$ev->addObserver(new Observer2());
$ev->startEvent();


EventObserver.php

abstract class EventObserver{
protected $observers=array();

function addObserver($observer){
$this->observers[] = $observer;
}
function notify(){
foreach( $this->observers as $obj ){
$obj->update($eventInfo=null);
}
}
}


Observer.php

interface Observer{
 function update($eventInfo=null);
}


原型模式

具体实现原理:通过clone 实现 大对象的初始化

作用:提高性能,因为如果一个大对象重复 new很消耗内存,通过clone只是内存的拷贝,所以可以大大提高性能

代码视图:比如 

$bigObj = new BigObj();

$bigObj->init();

$bigObj= clone $bigObj;

$bigObj->draw(1,2,3,4);

$bigObj= clone $bigObj;

$bigObj->draw(2,2,6,4);


装饰器模式

代码视图:

Canvas.php

<?php 
namespace Decrator;


class Canvas{
private $arr;
function addDecrator(IDecrator $dec){
$this->arr[] = $dec;

}
function beforeDraw(){
foreach( $this->arr as $ar ){
echo $ar->beforeDraw();
}
}
function afterDraw(){
$this->arr = array_reverse($this->arr);
foreach( $this->arr as $ar ){
echo $ar->afterDraw();
}
}
function draw(){
$this->beforeDraw();
echo "nihao";
$this->afterDraw();
}
}

IDecrator.php

<?php 
namespace Decrator;


interface  IDecrator{
function beforeDraw();
function afterDraw();
}


?>

Red.php

<?php 
namespace Decrator;


class Red implements  IDecrator{
function beforeDraw(){
echo "<div style='color:red'>";
}
function afterDraw(){
echo "</div>";
}
}


?>


业务端代码:

<?php


define("BASE_DIR", __DIR__);
require BASE_DIR."/Loader/Index.php";
spl_autoload_register( "\\Loader\\Index::autoload" );




$draw = new \Decrator\Canvas();
//添加装饰器
$draw->addDecrator(new \Decrator\Red());
$draw->draw();
?>

迭代器模式

namespace MIterator;


class Users implements  \Iterator{
private $ids;
private $index;
function __construct(){
$conn=mysql_connect("localhost","root","1234");
mysql_select_db("qibo",$conn);
$result= mysql_query("select id from qb_template ",$conn);
while( $row= mysql_fetch_array($result) ){
$this->ids[] = $row;
}
var_dump($this->ids);
mysql_close($conn);
}

function rewind(){
//指针返回到初始位置
$this->index=0;
}
//验证
function valid(){
return $this->index<count($this->ids);
}

function current(){
//获取当前的数据
$conn=mysql_connect("localhost","root","1234");
mysql_select_db("qibo",$conn);

$res= mysql_query("select * from qb_template where id=".$this->ids[$this->index]["id"],$conn);

$row = mysql_fetch_array($res,MYSQL_ASSOC);
mysql_close($conn);

return $row;
}
//下一条
function next(){
$this->index++;
}
//返回当前索引
function key(){
return $this->index;
}
}


测试代码:

$users = new \MIterator\Users();
foreach( $users as $u ){
var_dump($u['name']);
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值