PHP常用设计模式

2,145 阅读2分钟

单例

确保某个类只new一个对象,比如应该连接数据库的对象

class Single{
    static private $obj = null;
    private function __construct(){}
    private function __clone(){}

    public function getInstance(){
        if(!self::$obj instanceof self){
             self::$obj = new self();
         }
         return self::$obj
    }
}

工厂

工厂类使用静态方法来生产对象实例,返回对象

<?php
/**
 *简单工厂模式(静态工厂方法模式)
 */
/**
 * Interface people 人类
 */
interface  people
{
    public function  say();
}
/**
 * Class man 继承people的男人类
 */
class man implements people
{
    // 具体实现people的say方法
    public function say()
    {
        echo '我是男人<br>';
    }
}
/**
 * Class women 继承people的女人类
 */
class women implements people
{
    // 具体实现people的say方法
    public function say()
    {
        echo '我是女人<br>';
    }
}
/**
 * Class SimpleFactoty 工厂类
 */
class SimpleFactoty
{
    public static function people($type){
         switch($type){
            case 'man' :
               return new man();
               break;
           case 'women' :
               return new women();
               break;             
      }     }
}
/**
 * 具体调用
 */
$man = SimpleFactoty::people('man');
$man->say();
$woman = SimpleFactoty::people('women');
$woman->say();

注册树

把对象注册到全局树上,方便调用。结合单例、工厂模式demo

//使用单例 工厂 完成注册模式
class Single{    
    public $param;    
    static private $obj;    
    private function __consturct($param){        
         $this->param = $param;     
    }    
    private function __clone(){}    
    static public function getInstance($param){        
        if(!(self::$obj instanceof self)){            
            self::$obj = new self($param);        
        }                
        return self::$obj;    
    }
}
class RandFactory{    
    static public function factory(){        
        return Single::getInstance('haha');    
    }
}
class Register{    
    static private $objs;    
    static public function set($alias,$obj){        
        self::$objs[$alias] = $obj;    
    }    
    static public function get($alias){        
        return self::$objs[$alias];    
    }    
    static public function _unset($alias){        
        unset(self::$objs[$alias]);    
    } 
}
Register::set('test',RandFactory::factory());
echo '<br/>';
var_dump(Register::get('test'));

观察者

主题提供注册和通知的接口,观察者提供自身操作的接口。(这些观察者拥有一个同一个接口。)观察者利用主题的接口向主题注册,而主题利用观察者接口通知观察者。

//观察者设计模式
interface Subject {    
    public function register(Observer $observer);    
    public function notify();
}
interface Observer{    
    public function watch();
}

//主题
class Action implements Subject{    
    protected static $_observers = [];    
    //把观察者挂注册树上    
    public function register(Observer $observer){        
        self::$_observers[]  = $observer;    
    }    
    public function notify(){        
        foreach(self::$_observers as $v){            
            echo $v->watch();        
        }    
    }
}
//观察者
class Dog implements Observer{    
    public function watch(){        
        return 'Dog watch';    
    }
}
class Cat implements Observer{   
    public function watch(){        
    return 'Dog watch';    
    } 
}
$action = new Action();
$action->register(new Dog);
$action->register(new Cat);
$action->notify();


使用观察者模式记录异常信息

//处理异常,有两个观察者,邮箱发送、文件日志
interface Exception_Observer{    
    public function watch(Exception_test $e);
}
class Exception_test extends Exception{    
    public static $_observers = [];   
    public static function register(Exception_Observer $observer){        
        self::$_observers[] = $observer;    
    }    
    public function __construct($message=null,$code=0){        
        parent::__construct($message,$code);        
        $this->notify();    
    }    
    private function notify(){       
        foreach(self::$_observers as $v){            
        $v->watch($this);        
        }   
     }
}
//观察者
class File1_Observer implements Exception_Observer{    
    public function watch(Exception_test $e){       
        $message="时间".date("Y-m-d H:i:s").PHP_EOL;        
        $message.="信息".$e->getMessage().PHP_EOL;        
        $message.="追踪信息".$e->getTraceAsString().PHP_EOL;        
        $message.="文件".$e->getFile().PHP_EOL;        
        $message.="行号".$e->getLine().PHP_EOL;        
        error_log($message,3,'F:/logException1.txt');    
    }
}
class File2_Observer implements Exception_Observer{    
    public function watch(Exception_test $e){        
        $message="时间".date("Y-m-d H:i:s").PHP_EOL;        
        $message.="信息".$e->getMessage().PHP_EOL;        
        $message.="追踪信息".$e->getTraceAsString().PHP_EOL;        
        $message.="文件".$e->getFile().PHP_EOL;        
        $message.="行号".$e->getLine().PHP_EOL;        
        error_log($message,3,'F:/logException2.txt');    
    }
}
class Email_Observer implements Exception_Observer{    
    public function watch(Exception_test $e){        
        $message="时间".date("Y-m-d H:i:s").PHP_EOL;        
        $message.="信息".$e->getMessage().PHP_EOL;        
        $message.="追踪信息".$e->getTraceAsString().PHP_EOL;        
        $message.="文件".$e->getFile().PHP_EOL;        
        $message.="行号".$e->getLine().PHP_EOL;        
        error_log($message,1,'******@qq.com');    
    }
}
Exception_test::register(new File1_Observer);
Exception_test::register(new File2_Observer);
Exception_test::register(new Email_Observer);
try {    
    throw new Exception_test("出现异常,记录一下");    
} catch (Exception_test $e) {    
    echo $e->getMessage();    
    echo "<ht/>";    
}

适配器

在不修改原本api类的基础上,根据业务添加新的适配类

引用别人的案例

www.cnblogs.com/whoknows/ar…