Common design patterns in PHP

/*
 * php factory pattern */
 //class Factory
 //{
 // static function crateDatabase(){
 // $db=new Factory();
 // return $db;
 // }
 //}
 //
 //$ db=Factory::crateDatabase();// Replace the new class by the function method . When the name and parameters of the class change, you only need to modify the createDatabase method to avoid modifying a large area of ​​code
 /*
 * Singleton mode such as database connection can be Avoid multiple connections to the database */
 class Database{
 public $age = 12 ;
 static protected $db = null ;
 private function __construct ()




            // Because the constructor is private , new
 {
     }
 static function getInstance (){
 if ( self :: $db instanceof self ){
 return self :: $db ;
 } else {
 self :: $db = new self () ;
 return self :: $db ;
 }
     }
 }
 //
 //$db=Database::getInstance();// This singleton pattern is also equivalent to the factory pattern
 /*
 * registration tree pattern */
 //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);

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=324730674&siteId=291194637