laravel的设计模式

一,服务容器

在laravel框架中 service container 是整个系统功能调度配置的核心, 将其称为laravel 框架的 “心脏” 也不为过.

组件化的思维在service container 体现的淋漓尽致.

在程序运行的过程过 service container 动态的为程序提供所需要的对象, 文件路径,系统配置.

service container就是这些东西的载体.

二,依赖和耦合

解决依赖实现解耦 才是应用service container 的最关键原因.

这里必须提到一个设计概念IOC(Inversion Of Control  控制反转)

其实 service container 相当于是一个 IOC容器. 控制反转模式主要是用来解决系统组件之间相互依赖关系的一种模式.

于是,我们可以使用这些模式来解决依赖.

下面给出一段依赖的实例:

trafficTool =new Leg();
   }
   
   public function visitTibet(){
      $this->trafficToll->go();
   }
}


//下面是在外部实例化时 调用的代码

$tra =new Traveller();
$tra->visitTibet();

这里要实现的功能是旅游者游西藏,而游西藏有可能有很多种方法.

在实际游西藏的实例中 我直接在构造函数中实例化了一双腿.

所以调用游西藏的函数的时候我实际上是用腿走过去的.上述的代码就产生了依赖.

我必须在构造函数中实例化来自于 类Leg的一双腿  否则对游西藏这个实例来说 我连一双腿都没有.

但是这样的代码是耦合的  如果多处调用该类  我们使用的永远是腿 IOC的设计模式就是来解决这一问题的.

三,工厂模式.

从上面的实例可知,交通工具实例化的过程是经常需要改变的,我有可能实例化的是一部车 而不是一双走路的腿.

所以我们可以将这部分提取到外部来管理 由调用者来决定.

这也就体现了面向对象的一个设计原则,既找出程序中会变化的方面,然后将其和固定不变的方面面向分离(Head First设计模式.) 一种简单的实现方案是利用工厂模式.下面是一个简单的工厂模式实现:         

class TrafficToolFactory
{
    public function createTrafficTool($name)
   {
    switch($name)
      {
         case 'Leg':
             return new Leg();
             break;
         case 'Car':
             return new Car();
             break;
         case 'Train':
             return new Train();
             break;
         default:
             exit("set trafficTool error!!!");
             break;      
      }  
   }
}

//如此写那么下面的实例化代码可以这么写
class Traveller
{
   protected $trafficTool;

   public function __construct($trafficTool)
   {
       //依赖产生
      $factory =new TrafficToolFactory();
      $this->trafficTool =$factory->createTrafficTool($trafficTool);
   }
   
   public function visitTibet(){
      $this->trafficToll->go();
   }
}

$tra =new Traveller();
$tra->visitTibet();

 这里我们添加了交通工具的工厂类  在旅游者实例化旅游对象的同时必须传入一个交通工具名字的参数,然后工厂会实例化对应的实例. 在一些简单的情况下  简单的工厂模式可以解决这个问题.

我们看到虽然"旅游者" & "交通工具" 之间的依赖关系没有了,但是却变成了"旅游者".

和"交通工具工厂之间的依赖". 当需求增加的同时.我们需要修改简单工厂模式,如果依赖增多.那么工厂就会相当庞大,依然不易于维护.


四,工厂模式

这时候该谈到laralve 设计模式中比较核心的东西 Ioc(Inversion of control)又称 依赖注入模式(Depe-ndency Injection).

控制反转是将组件内的依赖关系从程序内部提取到外部容器来管理.

依赖注入是指组件的依赖通过外部以参数形式或其他形式注入.两种说法 本质上是一个意思.


以下是一段依赖注入的代码:

class Traveller
{
   protected $trafficTool;

   public function  __construct(Visit $trafficTool)
   {
      $this->trafficTool =$trafficTool;
   }

   public function visitTibet()
   {
      $this->trafficTool->go();
   }
}

这样在依赖注入的同事就已经实例化了一个对象.

日记本

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

赞赏支持
被以下专题收入,发现更多相似内容