您的位置:首页 > 编程语言 > PHP开发

PHP 常用设计模式 总结

2015-11-02 13:45 651 查看
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{

4000
 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']);

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  PHP 设计模式