PHP设计模式(二)

目录结构

qq%e5%9b%be%e7%89%8720170513193220

1)适配器模式
可以将截然不同的函数接口封装成统一的API ,实际应用举例,php的数据库操作有mysql,mysqli,pdo 3种,可以用适配器模式统一成一致。类似的场景还有cache适配器,将memcache,redis,file,apc等不同的缓存函数,统一成一致。 实现方式,定义统一的接口

Config\Idb.php

<?php
namespace Config;

interface IDb{
    function connect($host,$user,$passwd,$dbname);
    function query($slq);
    function close();
}

然后在对应的文件里面继承这个接口,然后按照各自的规则实现定义的这几个类

Config\Db\Mysql.php

<?php
namespace Config\Db;

use Config\IDb;

class Mysql implements IDb{
    protected $conn;
    function connect($host, $user, $passwd, $dbname)
    {
        $conn =  mysql_connect($host, $user, $passwd);
        mysql_select_db($dbname, $conn);
        $this->conn = $conn;
    }
    function query($sql)
    {
        $res = mysql_query($sql,$this->conn);
        return $res;
    }
    function close(){
        mysql_close($this->conn);
    }
}

Config\Db\Mysqli.php

<?php
namespace Config\Db;

use Config\IDb;

class Mysqli implements IDb{
    protected $conn;
    function connect($host, $user, $passwd, $dbname)
    {
        $conn =  mysqli_connect($host,$user,$passwd,$dbname);
        $this->conn = $conn;
    }
    function query($sql)
    {
        $res = mysqli_query($this->conn,$sql);
        return $res;
    }
    function close(){
        mysqli_close($this->conn);
    }
}

Config\Db\Pdo.php

<?php
namespace Config\Db;

use Config\Idb;

class Pdo implements IDb{
    protected $conn;
    function connect($host, $user, $passwd, $dbname)
    {
        $this->conn = new \PDO("mysql:host=$host;dbname=$dbname",$user,$passwd);
    }
    function query($sql)
    {
       $res = $this->conn->query($sql);
        return $res;
    }
    function close(){
        unset($this->conn);
    }
}

去创建对应的适配器实例。 然后调用的时候,就看引入那个数据类型的文件,就使用对应的方法。

index.php

<?php
define('BASEDIR',__DIR__);
require_once('/Config/Loader.php');
spl_autoload_register('\\Config\\Loader::autoload');

$db = new \Config\Db\Pdo();
$db->connect('localhost','root','123456','test');
$res = $db->query('select * from class');
foreach ($res as $val) {
    var_dump($val);
};
$db->close();

2)策略模式
将一组特定的行为和算法封装成类,以适应某些特定的上下文环境,这种模式就是策略模式。
实例:加入一个电商网站系统,针对男女性用户要各自跳转到不同的商品类目,并把所有广告位展示不同的广告。
正常的开发中,都是用if else来判断男女加载不同的信息。
实现Ioc,依赖倒置,控制反转。

扫描二维码关注公众号,回复: 9763107 查看本文章

实现方式:
通过创建一个接口,把相应的方法定义出来,然后再创建对应的类来继承这个接口。并实现这些方法。

Config\UserStartege.php

<?php

namespace Config;


interface UserStratege
{
   function showAd();
   function showCategory();
}

Config\MaleStartege.php

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2017/5/13
 * Time: 14:09
 */

namespace Config;


class MaleStratege implements UserStratege
{
    public function showAd()
    {
        echo "AD:";
        echo "SONY XBOX";
        echo "</br>";
    }
    public  function showCategory()
    {
        echo "Category:";
        echo "男人";
    }
}

Config\FemaleStartege.php

<?php

namespace Config;


class FemaleStratege implements UserStratege
{
    public function showAd()
    {
        echo "AD:";
        echo "新款女装";
        echo "</br>";
    }
    public  function showCategory()
    {
        echo "Category:";
        echo "女人";
    }
}

然后再使用的时候,根据实际情况调用对应的策略。然后先调用set方法来设置策略生成的的东西,然后index函数来展示。

index.php

<?php
define('BASEDIR',__DIR__);
require_once('/Config/Loader.php');
spl_autoload_register('\\Config\\Loader::autoload');

class page
{
    /**
     * @var \Config\UserStratege;
     */
    protected $stratege;
    public function index()
    {
        $this->stratege->showAd();
        $this->stratege->showCategory();
    }
    public function setStratege(\Config\UserStratege $stratege)
    {
        $this->stratege = $stratege;
    }
}
$page = new page();
if(isset($_GET['female'])){
    $stratege = new \Config\FemaleStratege();
}else{
    $stratege = new \Config\MaleStratege();
}
$page->setStratege($stratege);
$page->index();

控制反转: 可以很方便的替换两个相关联的类

3)数据对象映射模式
是将对象和数据存储映射起来,对一个对象操作会映射为对数据存储的操作。
在代码中实现数据对象映射模式,我们将实现一个ORM类,将复杂的SQL语句映射成对象属性的操作。
结合使用数据对象映射模式,工厂模式,注册模式。
这样就可以屏蔽底层的数据操作。

student表DDL

CREATE TABLE `student` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `name` varchar(30) NOT NULL,
  `age` int(10) NOT NULL,
  `sex` int(1) NOT NULL,
  `class_id` int(2) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;

Config\Student.php

<?php

namespace Config;


class Student
{
    public $id;
    public $name;
    public $age;
    public $sex;
    public $classid;

    protected $db;
    public function __construct($id)
    {
        $this->db = new \Config\Db\Mysqli();
        $this->db->connect('localhost','root','123456','test');
        $res = $this->db->query('select * from student limit 1');
        $data = $res->fetch_assoc();
        $this->id = $data['id'];
        $this->name = $data['name'];
        $this->age = $data['age'];
        $this->sex = $data['sex'];
        $this->classid = $data['class_id'];
    }
    public function __destruct()
    {
        $this->db = new \Config\Db\Mysqli();
        $this->db->connect('localhost','root','123456','test');
        $this->db->query("update student set name = '{$this->name}',age = {$this->age},sex = {$this->sex},class_id={$this->classid} WHERE id = {$this->id}");
    }
}

Config\Foctory.php

<?php
namespace Config;

class Factory
{
    static public function createDb()
    {
        $db = Db::getInstance();
        Register::set('db',$db);
    }

    static public function getStudent($id)
    {
        $key = 'student_'.$id;
        if(Register::get($key)){
            return Register::get($key);
        }else{
            $model =  new \Config\Student($id);
            Register::set($key,$model);
        }
        return Register::get($key);
    }
}

index.php

<?php
define('BASEDIR',__DIR__);
require_once('/Config/Loader.php');
spl_autoload_register('\\Config\\Loader::autoload');

class page
{
    public function index()
    {
        $student = \Config\Factory::getStudent(1);
        $student->name = 'dada6';
        $this->test();
    }
    public function test()
    {
        $student = \Config\Factory::getStudent(1);
        $student->classid = 1;
    }
}
$page = new Page();
$page->index();

这个就是yii的model实现数据库操作的设计模式。

就是在控制器层不出现sql语句,然后再model里面,__construct这个构造函数中创建数据库连接,然后在__destruct析构函数中,将属性保存到数据库里面,使用sql的update操作。

猜你喜欢

转载自www.cnblogs.com/xiaobingch/p/12464494.html
今日推荐