美文网首页
2019-03-31Contract 契约模式

2019-03-31Contract 契约模式

作者: cuiyao50 | 来源:发表于2019-03-31 22:52 被阅读0次

浅谈Laravel中的设计模式(四) Contract 契约模式

技术预备:熟悉Laravel的使用

契约模式(Contract)

一、首先什么是契约模式呢?

学过Java的童鞋一定知道interface、抽象类之类的概念。

主要就是为了具有相同操作的类定义一些共同的方法,但是具体逻辑就由具体类去实现,也就是为了降低耦合度。

另外就是为了定下一个相同的规范,因为在实际工作中很有可能相同功能的类是由不同的人员编写的,及早定下规范更便于使用。

二、契约模式有什么用呢?

在这里,我们使用Redis和Memcache举例。这两个都是缓存数据库,一些操作如:set、get之类的他们是共有的,那么就可以定下一个契约Cache,在其中定义共有的操作。

namespace App\Contract;

interface Cache{    

publicfunctionconnection($config);    

publicfunctionset($key,$value);    

publicfunctionget($key);    

publicfunctiondel($key);

}

然后定义了实现Cache的Redis和Memcache类

namespace App\Cache;

use App\Contract\Cache;

class Redis implements Cache{    

publicfunctionconnection($config)    {     // TODO: Implement connection() method.    }    

publicfunctionset($key,$value)    {        // TODO: Implementset() method.    }    

publicfunctionget($key)    {        // TODO: Implement get() method.    }    

publicfunctiondel($key)    {        // TODO: Implement del() method.    }

}

namespace App\Cache;

use App\Contract\Cache;

class Memcache implements Cache{    

publicfunctionconnection($config)    {        // TODO: Implement connection() method.    }    publicfunctionset($key,$value)    {        // TODO: Implementset() method.    }    publicfunctionget($key)    {        // TODO: Implement get() method.    }    

publicfunctiondel($key)    {        // TODO: Implement del() method.    }

}

在具体的逻辑代码中,我们使用了Redis作为缓存数据库。

use App\Cache\Redis;

class StudentController{    

private$cache;    

publicfunction__construct()    {$this->cache = new Redis();    }    

publicfunctiongetStudent()    {$this->cache->get('student');    }

}

但是当某一天,需要切换到Memcache作为缓存的时候,只需要把Redis类替换掉就能完美切换。

use App\Cache\Memcache;

class StudentController{    

private$cache;    

publicfunction__construct()    {$this->cache = new Memcache();    }    

publicfunctiongetStudent()    {$this->cache->get('student');    }

}

因为具体的set、get等操作是由类自己去实现的。而调用操作方法的参数在契约类Cache中已经定下了规范,并不会影响到其他逻辑。

看过前面篇章的童鞋估计已经想到了,这不就和Facade一样了吗!又是为了切换时可以无缝对接。

是的,如果说他们的效果的话的确是一样的,使用契约模式编写完Redis和Memcache类之后,的确可以放到Application中作为Facade来调用。

但是需要切换的时候,Facade对应的是全局的切换,而Contract就是局部的切换。例如我只想某个接口进行Redis到Memcache切换的话,那就需要用到Contract契约模式了。

三、结语

可以看到,Laravel中有着非常多的设计模式。从最前面的关注点分离(SoC),到外观模式(Facade)、容器(Container),最后到契约模式(Contract),很多都是为了解耦、为了无缝切换,是许许多多的程序员们被时常变更的需求给虐出来的。

但其实日常开发中,能用到这么多设计模式的机会是很少的。

有时我自己也在想,Laravel这个框架究竟是不是过度设计了?这个只能留给读者们自己思考了。

----- End -----

相关文章

  • 2019-03-31Contract 契约模式

    浅谈Laravel中的设计模式(四) Contract 契约模式 技术预备:熟悉Laravel的使用 契约模式(C...

  • Android MVP模式规范

    概述 统一MVP模式代码规范(该规范基于google推荐的mvp模式) 契约类 契约类主要是为了减少类泛滥问题,契...

  • 契约模式Design by Contract

    契约模式Design by Contract 背景 Design by Contract是Bertrand Mey...

  • 思考一则

    人际关系中越来越流行契约,原因不得而知,在家庭关系中,这种契约也呈现出更为具体化的模式,比如赡养。契约精神所要求的...

  • Android 快速打造Kotlin+MVP+Rxjava+Re

    快速打造Kotlin+MVP+Rxjava+Retrofit项目架构(引用Google推荐架构模式:契约接口) 文...

  • 法律是管理工具还是契约?

    今日《资治通鉴》 法律是管理工具还是契约? 法律是一种管理工具还是一种契约,是两种完全不同的社会治理模式。 一、禁...

  • 契约精神

    契约精神本体上存在四个重要内容: 契约自由精神、契约平等精神、契约信守精神、契约救济精神。 契约自由精神包含三个方...

  • 契约的三原色

    契约的三原色 契约的三原色,硬契约+软契约,价值观,契合度。 硬契约和软契约代表了真实世界中我们可以调用的资源。 ...

  • 契约 契约

    一 几年前,国富接到一个电话。王主任邀约好几位有文化的人去处理一件事情:有一男孩要过继于人,写个契约。...

  • 强化契约精神,遵循既定规则,你虽约束,但自由

    契约是一纸合同,契约就是一张结婚证,契约形成一部法律,契约造就一种规则。 不遵守契约精神,就等于违反了先前的约定,...

网友评论

      本文标题:2019-03-31Contract 契约模式

      本文链接:https://www.haomeiwen.com/subject/prypbqtx.html