php 设计模式(学习笔记)

php 有如下几种设计模式:


初听到设计模式可能让你觉得很抽象,其实设计模式就是对常见编程问题的灵活解决方案

1、工厂模式(Factory)

      他之所以被成为工厂模式是因为他负责“生产“ 对象,看看下面的例子

<?php
    class Factory{
            public static function factory($filename){
                if(include $filename.'.php'){
                    $classname = "class_".$filename; 
                    return new $classname;                
             }else{
                     throw new Exception("without this class");
             }
        } 
    }
?>

   你如何调用呢: 
<?php
	$factoryMql= factory::factory("Mysql");
?>
看到了吧,那个参数,我这里是"Mysql"实际上就是要生成对象的类的名称。


2、单例模式(Singleton)

      用于为一个类生成一个唯一的对象,使用单例模式生成一个对象后,该对象可以被其他众多对象所使用。

      例如:

     

<?php
class Singleton{
		private static $ss;
		
		private function  __construct(){
			echo "contruct";			
		}
		
		public static function singleton(){
			if(!isset(self::$ss)){
				$c = __CLASS__;
				self::$ss = new $c;
			}
			
			return self::$ss;
		}
	
		public static function normal(){
			  echo "I am normal function";
		} 
		
		public static function __clone(){
			trigger_error("forbbiden");
		}
} 
?>

访问举例:

<?php

$test = Singleton::singleton;
$test->normal();

?>


举例说明:由于上面的类中构造方法被声明成了private,所以我们无法用new来实例化这个类,我们只能通过访问singleton方法(例如:$test = Singleton::singleton)来获得累的对象,然后我们在用生成的对象,我这个例子里是$test来访问类中的其他方法。例如($test->normal())。禁止克隆单例对象。


3、观察者模式

     即一个对象通过添加一个方法,使自身变得可观察。当自身发生改变时,它会发送消息给已注册的观察者。观察者收到信息以后执行的操作可以完全与被观察者无关。换句话说,观察者观察被观察者,被观察者发生改变时,通知观察者,收到通知以后观察者就可以做自己想做的事情啦

      举例如下:

      

<?php

interface  IObserver{
	function onChanged($sender,$args);
}

interface  IObserverable{
	function addObserver($observer);
}

class UserList implements IObserverable{
		private $_observers = array();
		
		public function addCustomer($name){
			foreach($this->_obervers as $obs){
				$obs->onChanged($this,$name);
			}
		}
		
		
		public function addObserver($observer){
			$this->_observers[]=$observer;
		}
}


class UserListLogger implements IObserver{
	public function onChanged($server,$args){
		echo "'$args' added to user list";
	}
}

$ul = new UserList();
$ul->addObserver(new UserListLogger());
$ul->addCustomer("Jack");
?>

      看到了吧,在上个例子中,类UserListLogger 就相当于一个观察者,当类UserList 添加新的用户时(调用 addCustomer($name))方法,他会在该方法内部调用观察者的onChanged()方法,以此来通知观察者。


4、命令链模式

      命令链模式是通过一个对象发送消息、命令和请求。或者通过一组处理程序发送任意内容。每个处理程序都会自己判断自己能否处理请求。如果可以则进行处理。

     举例程序:    

<?php
interface ICommand{
	function onCommand($name,$args);
} 

class CommandChain{
	private $_command = array();
	
	public function addCommand($cmd){		 
			$this->_command[]=$cmd;			
	}
	
	public function runCommand($name,$args){
	
		foreach ($this->_command as $cmd){
				if($cmd->onCommand($name,$args)){
						return;
				}
		}
	}
}
	
	class UserCommand implements ICommand{
				public function onCommand($name,$args){
					if($name!='addUser') return false;
					echo ("UserCommand handling 'addUser' ");
					return true;
				}		
	}
	
	class MailCommand implements ICommand{
		public function onCommand($name,$args){
			if($name!='mail')return false;
			echo ("MailCommand handling 'mail'");
			return true;
		}
	}

	
	$cc = new CommandChain();
	$cc->addCommand(new UserCommand);
	$cc->addCommand(new MailCommand);
	$cc->runCommand('addUser',null);
	$cc->runCommand('mail',null);
	
	
?>

5、策略模式

      例如如果你想使用不同的排序方式对程序搜索到的结果进行排序,策略模式是个不错的选择,你可以选择不同的排序策略吐舌头

    

     举例如下:

     

<?php
interface IStrategy{
	function filter($record);
}

class FindAfterStrategy implements IStrategy{
	private $_name;
	
	public function __construct($name){
		 $this->_name = $name;
	}
	
	public function filter($record){	
		return strcmp($this->_name,$record)<=0;
	}
}


class RandomStrategy implements Istrategy{
	public function filter($record){
		return rand(0,1)>=0.5;
	}
}

class UserList{
	private $_list;
	
	public function __construct($names){
		if($names!=null){
			foreach($names as $name){
				 $this->_list[]=$name;
			}
			
		}
	}
	
	
	public function add($name){
		$this->_list[]=name;
	}
	
	public function find($filter){
		$recs = array();
		foreach($this->_list as $user){
			if($filter->filter($user)){
				$recs[]=$user;
			
			}
		}
		return $recs;
	}
}


$ul = new UserList(array("Andy","Jack","Lori","Megan"));
$f1 = $ul->find(new FindAfterStrategy("J"));
echo "f1";
var_dump($f1);
echo "<br>";
$f2 = $ul->find(new RandomStrategy());
echo "f2<br>";
var_dump($f2);
?>

 

看到啦,在上面这个例子中程序选用了策略一排序方式:  

strcmp($this->_name,$record)<=0;
或者策略二排序方式:

return rand(0,1)>=0.5;



好啦,写完啦,上面是我学习php常用设计模式的笔记

参考了php手册和Jack D Herrington 的《五种常见的 PHP 设计模式》,在这里非常感谢微笑

   


 




    


  


阅读更多
个人分类: PHP
上一篇mysql linux下密码丢失的解决方案
下一篇php的curl和socket的区别
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭