阅读时长:3分钟
技术预备:熟悉Laravel的使用
契约模式(Contract)
一、首先什么是契约模式呢?
学过Java的童鞋一定知道interface、抽象类之类的概念。
主要就是为了具有相同操作的类定义一些共同的方法,但是具体逻辑就由具体类去实现,也就是为了降低耦合度。
另外就是为了定下一个相同的规范,因为在实际工作中很有可能相同功能的类是由不同的人员编写的,及早定下规范更便于使用。
二、契约模式有什么用呢?
在这里,我们使用Redis和Memcache举例。这两个都是缓存数据库,一些操作如:set、get之类的他们是共有的,那么就可以定下一个契约Cache,在其中定义共有的操作。
namespace App\Contract;
interface Cache
{
public function connection($config);
public function set($key, $value);
public function get($key);
public function del($key);
}
然后定义了实现Cache的Redis和Memcache类
namespace App\Cache;
use App\Contract\Cache;
class Redis implements Cache
{
public function connection($config)
{
// TODO: Implement connection() method.
}
public function set($key, $value)
{
// TODO: Implement set() method.
}
public function get($key)
{
// TODO: Implement get() method.
}
public function del($key)
{
// TODO: Implement del() method.
}
}
namespace App\Cache;
use App\Contract\Cache;
class Memcache implements Cache
{
public function connection($config)
{
// TODO: Implement connection() method.
}
public function set($key, $value)
{
// TODO: Implement set() method.
}
public function get($key)
{
// TODO: Implement get() method.
}
public function del($key)
{
// TODO: Implement del() method.
}
}
在具体的逻辑代码中,我们使用了Redis作为缓存数据库。
use App\Cache\Redis;
class StudentController
{
private $cache;
public function __construct()
{
$this->cache = new Redis();
}
public function getStudent()
{
$this->cache->get('student');
}
}
但是当某一天,需要切换到Memcache作为缓存的时候,只需要把Redis类替换掉就能完美切换。
use App\Cache\Memcache;
class StudentController
{
private $cache;
public function __construct()
{
$this->cache = new Memcache();
}
public function getStudent()
{
$this->cache->get('student');
}
}
因为具体的set、get等操作是由类自己去实现的。而调用操作方法的参数在契约类Cache中已经定下了规范,并不会影响到其他逻辑。
看过前面篇章的童鞋估计已经想到了,这不就和Facade一样了吗!又是为了切换时可以无缝对接。
是的,如果说他们的效果的话的确是一样的,使用契约模式编写完Redis和Memcache类之后,的确可以放到Application中作为Facade来调用。
但是需要切换的时候,Facade对应的是全局的切换,而Contract就是局部的切换。例如我只想某个接口进行Redis到Memcache切换的话,那就需要用到Contract契约模式了。
三、结语
可以看到,Laravel中有着非常多的设计模式。从最前面的关注点分离(SoC),到外观模式(Facade)、容器(Container),最后到契约模式(Contract),很多都是为了解耦、为了无缝切换,是许许多多的程序员们被时常变更的需求给虐出来的。

但其实日常开发中,能用到这么多设计模式的机会是很少的。
有时我自己也在想,Laravel这个框架究竟是不是过度设计了?这个只能留给读者们自己思考了。
----- End -----
更多好文
请扫描下面二维码
欢迎关注~
