当前位置:首页 > 设计模式 > 正文内容

Laravel中用到的设计模式

phpmianshi7年前 (2014-04-10)设计模式362

1:工厂模式


Auth::user()
此处Auth这个类就是工厂中的方法,Auth是注册树中的别名。
好处:
类似于函数的封装,使对象有一个统一的生成(实例化)入口。当我们对象所对应的类的类名发生变化的时候,我们只需要改一下工厂类类里面的实例化方法即可。
2:单例模式
好处:
对象不可外部实例化并且只能实例化一次,节省资源。
实现方式:
private static $ins = null;                                                //设置私有的属性
private function __construct() {}                                       //使外部无法new这个类
public static function getIns() {                                        //暴露给外部的调用方法
        if(self::$ins instanceof self) {
                return self::$ins;
        } else {
                self::$ins = new self();
                return self::$ins;
        }
}
声明一个类的私有或者保护的静态变量,构造方法声明为私有(不允许外部进行new操作),如果不存在则实例化它,然后返回,如果存在则直接返回。
3:注册树模式
使用:
config/app里的aliases数组便是一个注册树
好处:
注册树模式就是使用数组结构来存取对象,工厂方法只需要调用一次(可以放到系统环境初始化这样的地方),以后需要调用该对象的时候直接从注册树上面取出来即可,不需要再调用工厂方法和单例模式。
实现方法:
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::$onjects[$alias]);
        }
}
$alias表示别名,自己设定
在工厂模式中添加
Register::set('db1',$db);
其他任何地方调用只需要调用注册器读取即可
Register::$objects['db1'];
4:适配器模式
将不同工具的不同函数接口封装成统一的API,方便调用。如:mysql,mysqli,PDO。
实现:在接口类里面申明统一的方法体,再让不同的类去实现这个接口,和重写其抽象方法。
interface Database {                                                  
        function connect($host,$user,$password,$dbname);
        function query($sql);
        function close();
}
然后再去用不同的工具函数去实现相同的接口。
5:策略模式
好处:
将一组特定的行为和算法封装成类,以适应某些特定的上下文环境,将逻辑判断和具体实现分离,实现了硬编码到解耦,并可实现IOC、依赖倒置、反转控制。
实现:
1.定义一个策略接口文件(UserStrategy.php),定义策略接口,声明策略
2.定义具体类(FemaleUserStrategy.php,MaleUserStrategy.php),实现策略接口,重写策略方法
class Page {
        protected $strategy;
        function index() {
                if($request->get('female')) {
                        $strategy=new FemaleUserStrategy();
                } else {
                        $strategy=new MaleUserStrategy();
                }
                $this->strategy->method();
        }
        public function __construct(UserStrategy $strategy) {
                $this->strategy=$strategy;
        }
}
6:数据对象映射模式
好处:将对象和数据存储映射起来,对一个对象的操作会映射为对数据存储的操作,这也是ORM的实现机制
class Model {
        public $id;
        public $name;
        public $email;
        ……
        function __construct($id) {
               //构造函数,调用class时自动执行,用来初始化。
               //查询逻辑
        }
        function __destruct() {
               //析构函数,当class调用完成后自动执行,用它来销毁实例,释放资源。
               //增删改逻辑
        }
}
7:观察者模式
使用:
Event::fire(new /event);
好处:
当一个对象状态发生改变时,依赖它的对象全部会收到通知并自动更新,实现低耦合,非侵入式的通知与更新机制。
实现:
EventGenerator.php                                            //事件产生者
abstract class EventGenerator{
         private $obserers = array();                        //观察者对事件发生者不可见
         function addObsever(Observer $observer) {
                 $this->obserers[] = $observer;
        }
        function ontify() {                                        //逐个调用观察者的handle方法
                 foreach ($this->obserers as $observer){
                         $observer->handle();
                 }
        }
}
event.php                                                           //事件类
class Event extends EventGenerator{
        function trigger(){
                $this->ontify();
        }
}
Observer.php                                                             //观察者接口
interface Observer {
        function update($event_info = null);                    //更新操作,可接受事件信息参数
}
Observer1.php                                                           //EventListener
class Observer1 implements Observer {
        function handle($event_info = null){
                echo "逻辑1";
        }
}
index.php                                                                   //Controller中function
$event = new \Event();
$event->addObsever(new \Observer1());
$event->trigger();


版权声明:本文由PHP面试资料网发布,如需转载请注明出处。
分享给朋友:

相关文章

php中的数据映射模式

概念数据对象映射模式,就是将对象和数据存储映射起来,对一个对象的操作会映射为对数据存储的操作,数据映射模式使您能更好的组织你的应用程序与数据库进行交互。大家如果用过 thinkphp 这个框架,应该知...

php中责任链模式

概念又叫职责链模式。包含了一些命令对象和一些处理对象,每个处理对象决定它能处理那些命令对象,它也知道应该把自己不能处理的命令对象交下一个处理对象,该模式还描述了往该链添加新的处理对象的方法。示例情景一...

Laravel中的基本概念

一.什么是 DI依赖注入/IOC控制反转DI依赖注入啥都不说,直接上代码<?php     class UserController ...

php中享元模式

概念享元模式(Flyweight),为了节约内存的使用,享元模式会尽量使类似的对象共享内存。在大量类似对象被使用的情况中这是十分必要的。常用做法是在外部数据结构中保存类似对象的状态,并在需要时将他们传...

php中的组合模式

概念当我们的一个对象可能代表一个单一的实体,或者一个组合的实体,但是仍然需要通过同样的方式被使用时,这种情形则适合使用组合模式的设计。示例一个表单类实例在处理其表单所有元素的方法与处理该表单自身实例方...

代理模式、桥接模式、中介者模式区别和联系

联系    在现实生活中,如房屋中介、买房人、卖房人,房屋中介是一个中介,因为它担任买房人和卖房人之间的相同;房屋中介也是一个代理,它在卖房人眼前是买房人的代理,在卖房人...

评论列表

phpmianshi
phpmianshi
6个月前 (05-12)

挺好的

发表评论

访客

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