详解五种常见的PHP设计模式
战略模式
战略模式是对象的行动模式,意图是对一组算法的封装。动态的选中需要的算法并使用。
战略模式指的是程序中触及决策操纵的一种模式。战略模式功效非常强大,由于这个设计模式本身的中心思想就是面向对象编程的多形性思想。
战略模式的三个角色:
1.抽象战略角色
2.详细战略角色
3.环境角色(对抽象战略角色的援用)
实现步骤:
1.定义抽象角色类(定义好各个实现的共同抽象办法)
2.定义详细战略类(详细实现父类的共同办法)
3.定义环境角色类(私有化说明抽象角色变量,重载结构办法,施行抽象办法)
就在编程领域之外,有很多例子是关于战略模式的。例如:
假如我需要在早晨从家里动身去上班,我可以有几个战略思考:我可以乘坐地铁,乘坐公交车,走路或其它的途径。每个战略可以得到雷同的结果,但是使用了不一样的资源。
战略模式的代码实例:
<?phpabstract class baseAgent { //抽象战略类 abstract function PrintPage(); } //用于客户端是IE时调取的类(环境角色) class ieAgent extends baseAgent { function PrintPage() { return 'IE'; } } //用于客户端不是IE时调取的类(环境角色) class otherAgent extends baseAgent { function PrintPage() { return 'not IE'; } } class Browser { //详细战略角色 public function call($object) { return $object->PrintPage (); } } $bro = new Browser (); echo $bro->call ( new ieAgent () ); ?>
工厂模式
工厂模式是我们最常用的实例化对象模式,是用工厂办法代替new操纵的一种模式。
使用工厂模式的好处是,假如你想要更换所实例化的类名等,则只需更换该工厂办法内容即可,不需逐一寻觅代码中详细实例化的地方(new处)修改了。为系统构造供给灵敏的动态扩展机制,减少了耦合。
<?php header('Content-Type:text/html;charset=utf-8'); /** *简便工厂模式(静态工厂办法模式) */ /** * Interface people 人类 */ interface people { public function say(); } /** * Class man 继承people的男人类 */ class man implements people { // 详细实现people的say办法 public function say() { echo '我是男人<br>'; } } /** * Class women 继承people的女人类 */ class women implements people { // 详细实现people的say办法 public function say() { echo '我是女人<br>'; } } /** * Class SimpleFactoty 工厂类 */ class SimpleFactoty { // 简便工厂里的静态办法-用于创立男人对象 static function createMan() { return new man(); } // 简便工厂里的静态办法-用于创立女人对象 static function createWomen() { return new women(); } } /** * 详细调取 */ $man = SimpleFactoty::createMan(); $man->say(); $woman = SimpleFactoty::createWomen(); $woman->say();
单例模式
单例模式确保某个类只要一个实例,并且自行实例化并向整个系统供给这个实例。
单例模式是一种常见的设计模式,在运算机系统中,线程池、缓存、日志对象、对话框、打印机、数据库操纵、显卡的驱动程序常被设计成单例。
单例模式分3种:懒汉式单例、饿汉式单例、登记式单例。
单例模式有以下3个特点:
1.只能有一个实例。
2.必需自行创立这个实例。
3.必需给其他对象供给这一实例。
那么为什么要使用PHP单例模式?
PHP一个主要利用场合就是利用程序与数据库打交道的场景,在一个利用中会存在大量的数据库操纵,针对数据库句柄连接数据库的行动,使用单例模式可以幸免大量的new操纵。由于每一次new操纵都会耗损系统和内存的资源。
class Single { private $name;//声明一个私有的实例变量 private function __construct(){//声明私有结构办法为了防止外部代码使用new来创立对象。 } static public $instance;//声明一个静态变量(留存在类中独一的一个实例) static public function getinstance(){//声明一个getinstance()静态办法,用于检测可否有实例对象 if(!self::$instance) self::$instance = new self(); return self::$instance; } public function setname($n){ $this->name = $n; } public function getname(){ return $this->name; } } $oa = Single::getinstance(); $ob = Single::getinstance(); $oa->setname('hello world'); $ob->setname('good morning'); echo $oa->getname();//good morning echo $ob->getname();//good morning
注册模式
注册模式,解决全局同享和交流对象。已经创立好的对象,挂在到某个全局可以使用的数组上,在需要使用的时候,直接从该数组上猎取即可。将对象注册到全局的树上。任何地方直接去拜访。
<?php class Register { protected static $objects; function set($alias,$object)//将对象注册到全局的树上 { self::$objects[$alias]=$object;//将对象放到树上 } static function get($name){ return self::$objects[$name];//猎取某个注册到树上的对象 } function _unset($alias) { unset(self::$objects[$alias]);//移除某个注册到树上的对象。 } }
适配器模式
将各种天壤之别的函数接口封装成统一的API。
PHP中的数据库操纵有MySQL,MySQLi,PDO三种,可以用适配器模式统一成一致,使不一样的数据库操纵,统一成一样的API。相似的场景还有cache适配器,可以将memcache,redis,file,apc等不一样的缓存函数,统一成一致。
第一定义一个接口(有几个办法,乃至响应的参数)。然后,有几种不一样的状况,就写几个类实现该接口。将完成类似功效的函数,统一成一致的办法。
#接口 IDatabase <?php namespace IMooc; interface IDatabase { function connect($host, $user, $passwd, $dbname); function query($sql); function close(); }
MySQL
<?php namespace IMooc\Database; use IMooc\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); } }
MySQLi
<?php namespace IMooc\Database; use IMooc\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); } }
视察者模式
1:视察者模式(Observer),当一个对象状态发生转变时,依靠它的对象全部会收到通知,并主动更新。
2:场景:一个事件发生后,要施行一连串更新操纵。传统的编程方式,就是在事件的代码之后直接参加处置的逻辑。当更新的逻辑增多之后,代码会变得难以保护。这种方式是耦合的,侵入式的,增添新的逻辑需要修改事件的主体代码。
3:视察者模式实现了低耦合,非侵入式的通知与更新机制。
定义一个事件触发抽象类。
EventGenerator.php <?php require_once 'Loader.php'; abstract class EventGenerator{ private $observers = array(); function addObserver(Observer $observer){ $this->observers[]=$observer; } function notify(){ foreach ($this->observers as $observer){ $observer->update(); } } }
定义一个视察者接口
Observer.php <?php require_once 'Loader.php'; interface Observer{ function update();//这里就是在事件发生后要施行的逻辑 } //一个实现了EventGenerator抽象类的类,用于详细定义某个发生的事件
实现:
require 'Loader.php'; class Event extends EventGenerator{ function triger(){ echo "Event<br>"; } } class Observer1 implements Observer{ function update(){ echo "逻辑1<br>"; } } class Observer2 implements Observer{ function update(){ echo "逻辑2<br>"; } } $event = new Event(); $event->addObserver(new Observer1()); $event->addObserver(new Observer2()); $event->triger(); $event->notify();
相关引荐:PHP教程
以上就是详解五种常见的PHP设计模式的具体内容,更多请关注百分百源码网其它相关文章!