首页 > 其他分享 >Laravel中用到的设计模式

Laravel中用到的设计模式

时间:2022-11-21 13:35:57浏览次数:58  
标签:Laravel function php 用到 class 调用 new 设计模式 self

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();

 

 

标签:Laravel,function,php,用到,class,调用,new,设计模式,self
From: https://blog.51cto.com/u_6353447/5873666

相关文章

  • Laravel中的基本概念
    一.什么是DI依赖注入/IOC控制反转DI依赖注入啥都不说,直接上代码<?phpclassUserController{private$user;function__construct(UserModel$u......
  • Laravel神奇的IoC容器
    Laravel的核心就是一个 IoC容器,根据文档,称其为“服务容器”通过举例来让读者去理解什么是 IoC(控制反转) 和 DI(依赖注入)超人和超能力,依赖的产生! 我们把一个“超人”作......
  • lumen项目集成laravelS后sentry无法上报的问题
    背景 公司项目严重依赖lumen系列,代码众多,重构困难,虽然访问量变大,性能问题越来越严重,急需要提升性能,于是找到了这个项目 laravelSgithub:​​https://github.com/hhxsv......
  • php中使用swoole加速lumen项目-laravelS实战
    ​背景 公司项目严重依赖lumen系列,代码众多,重构困难,虽然访问量变大,性能问题越来越严重,急需要提升性能,于是找到了这个项目 ​​https://github.com/hhxsv5/laravel-s​​ ......
  • 设计模式--创建型模式
    设计模式--创建型模式创建型模式,共五种:工厂方法模式(一个工厂类ReturnNew子类)、抽象工厂模式(一个厂一个子类)、单例模式(恶汉,懒汉)、建造者模式(组合)、原型模式(Cloneable浅......
  • 设计模式--结构型模式
    设计模式--结构型模式结构型模式,共七种:适配器模式(新接口用老实现类)、装饰器模式(同代理,增强)、代理模式(方法前后)、外观模式(计算机包括…)、桥接模式(中间表)、组合模式(树)、......
  • 设计模式--行为型模式
    设计模式--行为型模式行为型模式,共十一种:策略模式(Calculator子类)、模板方法模式(大象装冰箱)、观察者模式(观察者列表)、迭代子模式、责任链模式、命令模式(一层接一层)、备忘......
  • php – Laravel – 从附带where子句的另一个表中不存在的记录中获取记录
    1.存在一个商户表id  name 2.存在一个会员表idadmin_idname3.查询还没有添加会员的商户信息DB::table('admin_users')->leftJoin('admin_ext','admin_ext.adm......
  • 114:设计模式_工厂模式实现
       设计模式是面向对象语言特有的内容,是我们在面临某一类问题时候固定的做法,设计模式有很多种,比较流行的是:GOF(GoupOfFour)23种设计模式。当然,我们没有必要全部学习......
  • 【设计模式】原型模式:猴头,我叫你一声你敢答应吗?
    1原型模式1.1概述原型模式是一种对象创建型模式,用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。原型模式允许一个对象再创建另外一个可定制的对象,无须知......