导航

常见设计模式

Posted on 2020-08-17 22:48  玻璃星  阅读(114)  评论(0编辑  收藏  举报

1、策略模式

特点:避免使用多重条件语句。

实现:定义一系列算法,将他们用封装起来,是他们可以互相替换。

<?php

abstract class Strategy{ //抽象策略类
    abstract function goToSchool();
}
class Run extends Strategy {//具体策略类
    function goToSchool() {
        return 'run';
    }
}
class Bicycle extends Strategy {
    function goToSchool() {
        return 'bicycle';
    }
}
class Bus extends Strategy {
    function goToSchool() {
        return 'bus';
    }
}

class Student { //策略角色
    public function goToSchool($object) {
        return $object->goToSchool ();
    }
}
$bro = new Student ();
echo $bro->goToSchool(new Bicycle());

2、单例模式

场景:程序应用中,涉及到数据库操作时,如果每次操作的时候连接数据库,会带来大量的资源消耗。可以通过单例模式,创建唯一的数据库连接对象。

实现:三私一公:私有的静态变量(存放实例),私有的构造方法(防止创建实例),私有的克隆方法(防止克隆对象),公有的静态方法(对外界提供实例)

单例模式分3种:懒汉式单例、饿汉式单例、登记式单例。(1.只能有一个实例。2.必须自行创建这个实例。3.必须给其他对象提供这一实例。)

<?php

class Singleton
{
    private $name;
    private static $_instance; //用来保存唯一实例
    private function __construct(){}//防止使用new创建对象
    private function __clone(){}//防止使用clone床对象
    public static function getInstance(){
        if(!self::$_instance)self::$_instance = new Singleton();//检查是否有实例对象
        return self::$_instance;
    }
    public function setName($n){$this->name = $n;}
    public function getName(){return $this->name;}
}

$a = Singleton::getInstance();
$b = Singleton::getInstance();
$a->setName("A");
$b->setName("B");
echo $a->getName();//B
echo $b->getName();//B

 3、简单工厂模式(静态工厂)

特点:用静态方法代替new操作。

作用:

 

<?php

interface pet
{
    public function  say();
}
class cat implements pet
{
    public function say(){
        echo '小猫<br>';
    }
}
class dog implements pet
{
    public function say(){
        echo '小狗<br>';
    }
}

class SimpleFactory
{
    // 简单工厂里的静态方法-用于创建小猫对象
    static function createCat(){
        return new cat();
    }
    // 简单工厂里的静态方法-用于创建小狗对象
    static function createDog(){
        return new dog();
    }
}

$man = SimpleFactory::createCat();
$man->say();
$woman = SimpleFactory::createDog();
$woman->say();

 4、注册模式

作用:创建全局对象

<?php

class Registry
{
    protected static $object;
    function set($name,$object){//挂到注册数上
        self::$object[$name] = $object;
    }
    function get($name){//获取树上的对象
        return self::$object[$name];
    }
    function remove($name){//从注册树上移除
        unset(self::$object[$name]);
    }
}

5、适配器模式

作用:统一操作方法名称。

场景:数据库操作有MySQL,MySQLi,PDO三种,可以用适配器模式统一成一致。将memcache,redis,file,apc等不同的缓存函数,统一成一致。

namespace DB;
interface IDatabase
{
    function connect($host, $user, $passwd, $dbname);
    function query($sql);
    function close();
}
namespace DB\MySQL;
use DB\IDatabase;

class MySQL implements IDatabase
{
    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);
    }
}
namespace DB\MySQL;
use DB\IDatabase;
class MySQLi implements IDatabase
{
    protected $conn;
    function connect($host, $user, $passwd, $dbname)
    {
        $conn = mysqli_connect($host, $user, $passwd, $dbname);
        $this->conn = $conn;
    }
    function query($sql)
    {
        return mysqli_query($this->conn, $sql);
    }
    function close()
    {
        mysqli_close($this->conn);
    }
}

6、观察者模式

作用:一个事件发生后,会跟着发生一连串操作的情况,用观察者模式可以减少程序的耦合性,

场景:例如评论功能做好后,又想增加一系列检查评论的功能,例如检查用户是否在黑名单,评论是否有屏蔽字段....

// 观察者接口
interface Observer{
    public function watch();
}
// 主题
class Action{
    public $obs = array();
    public function register(Observer $observer){
        $this->obs[]=$observer;
    }

    public function notify(){
        foreach ($this->obs as $v) {
            $v->watch();
        }
    }
}

// 观察者
class Cat implements Observer{
    public function watch(){
        echo "Cat watches TV<hr/>";
    }
}
 class Dog implements Observer{
     public function watch(){
         echo "Dog watches TV<hr/>";
     }
 }
 class People implements Observer{
     public function watch(){
         echo "People watches TV<hr/>";
     }
 }

// 应用实例
$action=new Action();
$action->register(new Cat());
//$action->register(new People());
$action->register(new Dog());
$action->notify();