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();