PHP常见的设计模式

/*
 * php工厂模式
 */

//class Factory
//{
//    static function crateDatabase(){
//        $db=new Factory();
//        return $db;
//    }
//}
//
//$db=Factory::crateDatabase();//通过函数方法 替换成new class 当类的名字和参数发生改变时只需要修改createDatabase这个方法 避免了修改大面积代码


/*
 * 单例模式 例如数据库的连接 可以避免多次连接数据库
 */
class Database{
    public $age=12;
    static protected $db=null;
    private function __construct()//由于构造函数是private 所以无法直接new
    {
    }
    static function getInstance(){
        if(self::$db instanceof self){
            return self::$db;
        }else {
            self::$db = new self();
            return self::$db;
        }
    }
}
//
//$db=Database::getInstance();//这个单例模式也相当于工厂模式



/*
 * 注册树模式
 */


//class Factory{
//
//    static function createDatabase($name){
//        $db=$name::getInstance();
//        return $db;
//    }
//
//}
//class Register
//{
//    public $age=12;
//    protected static $objects;
//    static function set($alias,$object)
//    {
//        self::$objects[$alias]=$object;
//    }
//    static function get($name){
//        return self::$objects[$name];
//    }
//    function _unset(){
//
//    }
//    public function age(){
//        echo $this->age;
//    }
//}
//
//Register::set('db1',Factory::createDatabase('Database'));//Database类的对象在Factory工厂中生产,并在Register这一个注册树上挂着 且命名为db1
//$db1=Register::get('db1'); //将挂在注册树上名为db1的对象
//
//var_dump($db1);


/*
 * 观察者模式
 */
//观察者
interface IObserver{
    function onChanged($sender,$args);
}
//定义可以被观察的对象接口
interface IObservable{
    function addObserver($observer);
}
class UserList implements IObservable
{
    //数组存放在观察者对象
    private $_observers=array();
    public function addCustomer($name)
    {
        // TODO: Implement addObserver() method.
        foreach ($this->_observers as $obs)
            $obs->onChanged($this,$name);
    }
    public function addObserver($observer){
        $this->_observers[]=$observer;
    }
}
class UserListLogger implements IObserver
{
   private $name;
   public function __construct($name)
   {
       $this->name=$name;
   }

    public function onChanged($sender, $args)
    {
        // TODO: Implement onChanged() method.
        echo $this->name." $args added to user list\n";

    }
}
$ul1=new UserList();
$ul1->addObserver(new UserListLogger('zhuguan'));
$ul1->addObserver(new UserListLogger('jingli'));//创建了两个观察者 当创建了新用户时 分别向这两个观察者发消息
$ul1->addCustomer('weisheng');

$ul2=new UserList();
$ul2->addObserver(new UserListLogger('zhangsan'));
$ul2->addObserver(new UserListLogger('lisi'));//创建了两个观察者 当创建了新用户时 分别向这两个观察者发消息
$ul2->addCustomer('liwei');

/*
 * 结果:
 * zhuguan weisheng added to user list
jingli weisheng added to user list
zhangsan liwei added to user list
lisi liwei added to user list
 */




/*
 * 策略模式
 */

//定义接口
interface Calc{
    public function getValue($num1,$num2);
}
//定义两个类表示2种可供选择的策略
class Add implements Calc{
    public function getValue($num1, $num2)
    {
        // TODO: Implement getValue() method.
        echo $num1+$num2;
    }
}

class Mul implements Calc{
    public function getValue($num1, $num2)
    {
        // TODO: Implement getValue() method.
        echo $num1*$num2;
    }
}

class CalcContext{
    private $_strategy=null;
    public function __construct(Calc $select)
    {
        $this->_strategy=$select;
    }
    //设置策略类
    public function setCalc(Calc $select){
        return $this->_strategy=$select;
    }
    public function getResult($m,$n){
        $this->_strategy->getValue($m,$n);
    }
}
$cal=new CalcContext(new Add());//调用Add策略
$cal->getResult(10,5);//15
$cal=new CalcContext(new Mul());//调用Mul策略
$cal->getResult(10,5);

猜你喜欢

转载自blog.csdn.net/qq_35885307/article/details/80057063