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
";
$this->notify();
}
}
class Observer1 implements \Controller\Observer{
public function update($eventInfo=null){
echo "Observ1 know
";
}
}
class Observer2 implements \Controller\Observer{
public function update($eventInfo=null){
echo "Observ2 know
";
}
}
//触发事件
$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
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
namespace Decrator;
interface IDecrator{
function beforeDraw();
function afterDraw();
}
?>
Red.php
namespace Decrator;
class Red implements IDecrator{
function beforeDraw(){
echo "
业务端代码:
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
}
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']);
}