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()方法,以此来通知观察者。
命令链模式是通过一个对象发送消息、命令和请求。或者通过一组处理程序发送任意内容。每个处理程序都会自己判断自己能否处理请求。如果可以则进行处理。
举例程序:
<?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 设计模式》,在这里非常感谢