IT序号网

PHP设计模式笔记知识解答

lxf 2021年06月13日 编程语言 169 0

一、工厂模式:减少new的使用,定义一个类,专门用来创建其它对象
例:

class A{ 
    static function create(){ 
        return new DB(); 
    } 
} 
$db = A::create();

二、单例模式:确保一个类只有一个实例
使用场景:缓存、日志对象、数据库操作只有一个实例。
缺点:
1. 难于调试
2. 隐藏的依赖关系
例:

class A { 
    //静态变量保存全局实例 
    private static $_init = null; 
    //私有构造函数,防止外部实例化对象 
    private function __construct(){ 
         
    } 
    //私有克隆函数,防止外部克隆对象 
    private function __clone(){ 
         
    } 
    //静态方法,单例统一访问入口 
    public static function getInit(){ 
        if (!isset(self::$_init)){ 
            self::$_init = new self(); 
        } 
        return self::$_init; 
    } 
     
    public function test(){ 
        echo '调用方法成功'; 
    } 
} 
 
$a = A::getInit(); 
$a->test();

三、策略模式:把特定行为封装成类,适应特定的环境
使用场景:电商男装女装
例:

//抽象策略接口 
interface A{ 
    public function show(); 
} 
//用于客户端是IE时调用的类(环境角色) 
class IE implements  A { 
    public function show(){ 
        return 'ie'; 
    } 
} 
//用于客户端不是firefox时调用的类(环境角色) 
class FF implements  A { 
    public function show(){ 
        return 'firefox'; 
    } 
} 
//具体策略角色 
class U { 
    public function index($obj){ 
        echo $obj->show(); 
    } 
} 
 
$user = new U(); 
$user->index(new FF);

四、观察者模式:当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新
使用场景:事件系统
缺点:性能降低
例:

//定义观察者接口 
interface Looker { 
    public function news($user);//定义接收通知的方法 
} 
//定义被观察事件的接口 
interface Event { 
    public function add($obj);//定义被观察事件的方法 
    public function notify($user);//定义通知所有观察者的方法 
} 
//被观察事件 
class E1 implements Event { 
    protected $obj = array(); 
     
    public function add($obj){//被观察事件 
        $this->obj[] = $obj; 
    } 
     
    public function notify($user){//通知所有观察者 
        foreach($this->obj as $o){ 
            $o->news($user); 
        } 
    } 
} 
//观察者 
class L1 implements Looker { 
    public function news($user){//接收通知 
        echo $user.'有新动态<br>'; 
    } 
} 
$event1 = new E1; 
$event1->add(new L1); 
$event1->notify('小明'); 
$event1->notify('小红'); 
$event1->notify('小李');

五、适配器模式:把各种不同的类封装成同一接口
使用场景:数据库mysql,mysqli。缓存memcache,redis,file。可以用适配器模式统一成一致

六、装饰者模式:可以动态的添加修改类的功能
例:

abstract class Beverage{ 
    public $_name; 
    abstract public function Cost(); 
} 
//被装饰者类 
class Coffee extends Beverage{ 
    public function __construct(){ 
        $this->_name = 'Coffee'; 
    } 
 
    public function Cost(){ 
        return 1.00; 
    } 
} 
// 以下三个类是装饰者相关类 
class CondimentDecorator extends Beverage{ 
    public function __construct(){ 
        $this->_name = 'Condiment'; 
    } 
 
    public function Cost(){ 
        return 0.1; 
    } 
} 
//2.加点牛奶 
class Milk extends CondimentDecorator{ 
    public $_beverage; 
 
    public function __construct($beverage){ 
        $this->_name = 'Milk'; 
 
        if($beverage instanceof Beverage){ 
            $this->_beverage = $beverage; 
        }else{ 
            die('Failure'); 
        } 
    } 
 
    public function Cost(){ 
        return $this->_beverage->Cost() + 0.2; 
    } 
} 
//3.加点糖 
class Sugar extends CondimentDecorator{ 
    public $_beverage; 
 
    public function __construct($beverage){ 
        $this->_name = 'Sugar'; 
 
        if($beverage instanceof Beverage){ 
            $this->_beverage = $beverage; 
        }else{ 
            exit('Failure'); 
        } 
    } 
 
    public function Cost(){ 
        return $this->_beverage->Cost() + 0.2; 
    } 
} 
 
//1.拿杯咖啡 
$coffee = new Coffee(); 
//2.加点牛奶 
$coffee = new Milk($coffee); 
//3.加点糖 
$coffee = new Sugar($coffee); 
 
printf("Coffee Total:%0.2f元\n",$coffee->Cost());

发布评论
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

搭建LNAMP环境(六)- PHP7源码安装MongoDB和MongoDB拓展知识解答
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。