PHP 设计模式

PHP 设计模式

1.单例模式
class Db {
    protected $db;
    provate function __construct(){}
    public static function getInstence(){
        if(self::$db){
           return self::$db;
        }
        self::$db = new self();
        return self::$db;
    }
}
2.工厂模式: (将DB类放到工厂里面,需要调用数据库类的地方,直接调用工厂就可以,无需到处配置DB)
class Factory {
    public static function createDB(){
        $db = Db::getInstence();
    }
}
3.注册模式
class Register {
      protected staitc $objects;
      public static function set($key, $object){
            self::$objects[$key] = $object;
      }
      public static function get($key){
            return self::$objects[$key];
      }
}
4. 适配器模式(例如:整合 mysql、mysqli、PDO)
// 定义DB接口
interface IDb{
    public function connect($host, $user, $password, $dbname);
    public function query($sql);
    public function close();
}

//mysql函数,实现接口
class mysql implements IDb {
    protected $link;
    public function connect($host, $user, $password, $dbname){
        $this->link = mysql_connect($host, $user, $password);
        mysql_select_db($dbname);
    }
    public function query($sql){
        return mysql_query($sql, $this->link);
    }
    public function close(){
        mysql_close($this->link);
    }
}

// mysqli 函数,实现接口
class mysqli implements IDb {
    protected $link;
    public function connect($host, $user, $password, $dbname){
        $this->link = mysqli_connect($host, $user, $password, $dbname);
    }
    public function query($sql){
        return mysqli_query($this->link, $sql);
    }
    public function close(){
        mysqli_close($this->link);
    }
}

// PDO 函数,实现接口
class PDO implements IDb {
    protected $dbh;
    public function connect($host, $user, $password, $dbname){
        $dsn = "mysql:dbname={$dbname}:host={$host}";
        $this->dbh = new PDO($dsn, $user, $password);
    }
    public function query($sql){
       return $thid->dbh->query($sql);
    }
    public function close(){
        unset($this->dbh);
    }
}


$db = new mysql();
$db = new mysqli();
$db = new PDO();
$db->connect('127.0.0.1', 'root', 'root', 'test');
$db->query('select * from user');
$db->close();
5.策略模式(适应某种场景上下文环境)
<?php
interface UserStrategy {
    public function showAd();
    public function showCategory();
}

class FamaleStrategy implements UserStrategy {
    public function showAD(){
        return '新款女装';
    }
    public function showCategory(){
        return '女装';
    }
}

class MaleStrategy implements UserStrategy{
    public function showAD(){
        return 'pro';
    }
    public function showCategory(){
        return '电子产品';
    }
}

class page {
    private $strategy;
    public function show(){
        echo $this->strategy->showAD();
        echo "<br>";
        echo $this->strategy->showCategory();
    }
    public function setStrategy(UserStrategy $strategy){
        $this->strategy = $strategy;
    }
}

$user = isset($_GET['user']) ? $_GET['user'] : '';
$page = new page();
if($user == 'famale'){
    $strategy = new FamaleStrategy();
}else{
    $strategy = new MaleStrategy();
}
$page->setStrategy($strategy);
$page->show();
6.数据对象映射模式(将类封装与数据对应)
// 用户表
create table user (
    user_id int primary key auto_incremnet,
    username char(20) not null
)
insert user values(null, 'user');


class user {
    public $user_id;
    public $username;
    private $link;
    public function __construct($user_id){
        $this->link = mysqli_connect('localhost', 'root', 'root', 'userdb');
        $res = mysqli_query($this->link, 'select * from user where id = $user_id");
        $user = $res->fetch_assoc();
        $this->user_id = $user['user_id'];
        $this->username = $user['username'];
    }
    public function __destruct(){
        mysqli_query($this->link, "update user set username='{$this->username}' where userid=$this->user_id");
    }
}

$user = new user(1);
$user->username = 'user123';

7.观察者模式
interface Observer {
    public function update();
}

class EventGenerator {
    private static $observers = array();
    public static function addObserver(Observer $observer){
        self::$observers[] = $observer;
    }

    public function notify(){
        foreach (self::$observers as $observer) {
            $observer->update();
        }
    }
}
class Event extends EventGenerator {
    public function trigger()
    {
        $this->notify();
    }
}
class Observer1 implements Observer {
    public function update(){
        echo 'observer1';
    }
}
class Observer2 implements Observer {
    public function update(){
        echo 'observer2';
    }
}
$event = new Event();
EventGenerator::addObserver(new observer2());
$event->trigger();
8.原型模式 (通过 close 原型对象创建新对象, 避免了没有new 对象的消耗,原型仅需要内存拷贝即可)
class  Prototype {
    public function __construct()
    {
    }
    public function test()
    {
        echo 'test';
    }
}

$prototype = new Prototype();

$prototype1 = close $prototype;
$prototype1->test();

$prototype2 = close $prototype;
$prototype2->test();
9. 装饰器模式 (可以动态添加修改类的功能)
interface IDecorater {
    public function before();
    public function after();
}
class TestDecorator {
    protected $idecorater;
    public function __construct(){

    }
    public function addObject(IDecorater $idecorater){
        $this->idecorater[]  = $idecorater;
    }
    private function before(){
        foreach ($this->idecorater as $object) {
            $object->before();
        }
    }
    private function after(){
        $this->idecorater = array_reverse($this->idecorater);
        foreach ($this->idecorater as $object) {
            $object->after();
        }
    }
    public function show(){
        $this->before();
        echo 'This is show';
        $this->after();
    }
}
class ColorDecorator implements IDecorater {
    protected $color;
    public function __construct($color = 'red'){
        $this->color = $color;
    }
    public function before(){
        echo "<div style='color:".$this->color."'>";
    }
    public function after(){
        echo "</div>";
    }
}
class SizeDecorator implements IDecorater{
    protected $size;
    public function __construct($size = 12){
        $this->size = $size;
    }
    public function before(){
        echo "<div style='font-size:".$this->size."'>";
    }
    public function after(){
        echo "</div>";
    }
}

$testDecorator = new TestDecorator();
$testDecorator->addObject(new ColorDecorator());
$testDecorator->addObject(new SizeDecorator(16));
$testDecorator->show();
10.迭代器模式(在不需要了解内部实现,遍历一个聚合对象的内部元素。使用集成 Iterator(迭代器)接口)
class Myiterator implements Iterator {
    private $position = 0;
    private $array = array(
        "firstelement",
        "secondelement",
        "lastelement",
    ); 
    public function __construct() {
        $this->position = 0;
    }
    public function rewind() {  // 返回到迭代器的第一个元素
        $this->position = 0;
    }
    public function current() {
        return $this->array[$this->position];
    }
    public function key() {
        return $this->position;
    }
    public function next() {
        $this->position++;
    }
    public function valid() { // 检查当前位置是否有效
        return isset($this->array[$this->position]);
    }
}

$Myiterator = new Myiterator();
echo "<pre>";
foreach ($Myiterator as $key => $value) {
    var_dump($key, $value);
}
11.代理模式 (客户端与实体之间建立一个代理对象[proxy], 客户端进行操作全部委托给代理对象,隐藏实体的具体实现细节)
/*
* 代理模式,实现数据库读写分类
*/
interface IUser {
    public function getUser($id);
    public function setUser($id='');
}
class Proxy implements Iuser {
    public function getUser($id){
        $user = Fectory::getDatabase('slave');
        $user->query("select * from user where id = {$id}");
    }
    public function setUser($id, $username){
        $user = Fectory::getDatabase('master');
        $user->query("update user set username = '{$username}' where id={$id}");
    }
}

$proxy = new Proxy();
$proxy->getUser(1);
$proxy->set(1, '123');

发表评论

电子邮件地址不会被公开。 必填项已用*标注