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();
挺好的