php 设计模式
常见的设计模式:装饰器模式,工厂模式,单例模式,命令模式,适配器模式,观察者模式
1.单例模式
只有一个实例,常用于数据库,减少多次链接带来的资源浪费
三私一公:私有的静态属性,私有的构造方法,私有的克隆方法,共有的静态方法
//单例模式//三私一公<?php class DB{
private static $instance;
private function __construct($db_config){
self::$instance = mysql_connenct(db_config);
}
private function __clone(){}
public static function getInstance(){
if(self::$instance instanceof self){
return self::$instance;
}
return new DB($config);
}
}?>
2.简单的工厂模式:
● 抽象的基类:类中定义一些抽象的方法,在子类中实现
● 继承自抽象基类中的子类:实现积累中的方法
● 工厂类:实例化所有工厂的子类
● 抽象的基类
<?php abstract class operation{
abstract public function getValue($num1,$num2);
} ?>
● 实现基类的子类
<?php
class operationAdd extends operation{//加法类
public function getValue($num1,$num2)
return $num1+$Num2;
}
class operationSub extends operation{// 减法类
public function getValue($num1,$num2)
return $Num1-$num2;
}
?>
● 工厂类:创建对象
<?php class Factory{
public static function createObj($operate){//根据操作符来实例化对应的对 象
switch($operate){
case '+':
return new operationAdd();
break;
case '-':
return new operationSub();
break;
}
}
} ?>
3.观察者模式
它是一种事件系统,意味着这一模式允许某个类观察另一个类的状态,当被观察的类状态发生改变的时候,观察类可以收到通知并且做出相应的动作。比如键盘,我一敲击,系统就收到通知并进行相应的回应。
对于PHP来说,PHP内置提供了两个接口来供外部应用区实现这个模式。
SplSubject 接口,它代表着被观察的对象,
其结构:
<?php
interface SplSubject{
public function attach(SplObserver $observer);
public function detach(SplObserver $observer);
public function notify();
} ?>
SplObserver 接口,它代表着充当观察者的对象
其结构:
<?php interface SplObserver{
public function update(SplSubject $subject);
}
SplSubject维护了一个特定的状态,当这个状态发生变化时,它就用notify()来通知之前用attach注册到SplSubject的所有SplObserver,并且调用其相应的update方法。
简单的例子:
<?php class subject implements SplSubject {
private $observers , $value;
public function __construct()
{
$this->observers = array();
}
public function attach(SplObserver $observer)
{
$this->observers[] = $observer;
}
public function detach(SplObserver $observer)
{
if($idx = array_search($observer, $this->observers, true))
{
unset($this->observers[$idx]);
}
}
public function notify()
{
foreach($this->observers as $observer){
$observer->update($this);
}
}
public function setValue($value)
{
$this->value = $value;
$this->notify();
}
public function getValue()
{
return $this->value;
}
} class observer implements SplObserver {
public function update(SplSubject $subject)
{
echo 'The new state of subject'.$subject->getValue();
}
} $subject = new subject();
$observer = new observer();
$subject->attach($observer);
$subject->setValue(5);
4.策略模式
在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能,如查找、排序等,一种常用的方法是硬编码(Hard Coding)在一个类中,如需要提供多种查找算法,可以将这些算法写到一个类中,在该类中提供多个方法,每一个方法对应一个具体的查找算法;当然也可以将这些查找算法封装在一个统一的方法中,通过if…else…或者case等条件判断语句来进行选择。这两种实现方法我们都可以称之为硬编码,如果需要增加一种新的查找算法,需要修改封装算法类的源代码;更换查找算法,也需要修改客户端调用代码。在这个算法类中封装了大量查找算法,该类代码将较复杂,维护较为困难。如果我们将这些策略包含在客户端,这种做法更不可取,将导致客户端程序庞大而且难以维护,如果存在大量可供选择的算法时问题将变得更加严重。
<?php
//策略模式
//对于实现一个方法有多种策略,每一个方法都可以达到目的
interface TravelStrategy{
public function travelAlgrithm();
}
class BusTravel implements TravelStrategy{
public function travelAlgrithm(){
echo 'i will travel buy bus';
}
}
class TrainTravel implements TravelStrategy{
public function travelAlgrithm(){
echo 'i will travel by train';
}
}
class Person{
private $travel;
public function __construct(TravelStrategy $travel){
$this->travel = $travel;
}
public function setTravelStrategy(TravelStrategy $travel){
$this->travel = $travel;
}
public function travel(){
$this->travel->travelAlgrithm();
}
}
//灵活的选择出行方式
//汽车
$person = new Person(new BusTravel());
$person->travel();
//火车
$person = new Person(new TrainTravel());
$person->travel(); ?>
构建者模式
对于复杂的对象创建时,使用,如sql语句的拼凑
<?php
//创建相对于复杂的对象时,例如sql拼凑
class UserInfo{
protected $name;
protected $age;
protected $sex;
public function setName($name){
$this->name = $name;
return $this;
}
public function setAge($age){
$this->age = $age;
return $this;
}
public function setSex($sex){
$this->sex = $sex;
return $this;
}
public function getInfo(){
echo 'name:'.$this->name.'age:'.$this->age.'sex:'.$this->sex;
}
}
$user = new UserInfo();
$user->setName('jonas')->setSex('m')->setAge(18)->getInfo();?>
转载请注明:XAMPP中文组官网 » 4分钟了解PHP常见的设计模式