![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
设计模式
dj1540225203
加油打工人
展开
-
设计模式-- 门面模式
门面模式的优点:对调用者屏幕很多子系统的实现(比如说和别人公司对接,可能他们需要的一个功能,需要涉及你们公司很多个系统的关联都要修改才能实现,此时你只需要丢一个门面过去就可以了) 调用者无需知道他实现这个功能具体需要用到哪些子系统的(解耦) 当可以随意增加或删减子系统 (调用者无感知)门面模式的缺点:当增加子系统时可能带来未知风险 门面不符合开闭原则下面以装修为例子说明一下:最近同事二狗子要装修房子,他装修之前呢,得先找个设计师设计,然后还需要找个水电工给新房子改水电,再然后,还得找.原创 2022-03-24 14:02:29 · 359 阅读 · 0 评论 -
设计模式-- 装饰器模式
给对象添加添加功能的方式直接修改原对象 写个子类继续拓展修改 对象数组合并的方式在面向对象的设计中,我们也应该尽量使用对象组合,而不是对象继承来扩展和复用功能。装饰器模式就是基于对象组合的方式,可以很灵活的给对象添加所需要的功能,并且它的本质就是动态组合,一句话,动态是手段,组合才是目的。优点:类层次不会过多造成混乱 需求改动小时不用改变原对象避免没必要的bug出现被修饰类/** * 被修饰类 现在的需求: 要求能够动态为CD添加音轨、能显示CD音轨列表。 显示时应采用单行并且为原创 2022-03-20 11:32:20 · 228 阅读 · 0 评论 -
设计模式 --命令模式
命令模式也叫事务模式,饭馆例子就是最好的解释了。我们是点菜就相当于命令的下达者;服务员就相当于命令接受者;厨师相当于命令的执行者。当你需要点菜或者修改菜单的时候(或者做什么新菜)就叫服务员;服务员会告诉给厨师听(炒鱼,做虾);优点:我们不用直接和厨师交流。我们可以下达多个命令,然后服务员可以把多个命令告诉不同的厨师处理。定义服务员代码class Invoker{ //存命令的变量 public command; //初始化命令 public function _原创 2022-03-10 00:22:26 · 103 阅读 · 0 评论 -
设计模式-- 原型模式
原型模式在很多框架中都有用到比如:yii2中 $query1 = clone $query;这就是原型模式的使用;原型模式是先创建好一个原型对象,然后通过clone原型对象来创建新的对象。适用于大对象的创建,因为创建一个大对象需要很大的开销,如果每次new就会消耗很大,原型模式仅需内存拷贝即可。它主要面对的问题是:“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是他们却拥有比较稳定一致的接口角色分析:1.抽象原型,提供了一个克隆的接口 2...原创 2022-03-09 23:53:10 · 69 阅读 · 0 评论 -
设计模式 -- 注册模式
注册模式其实想实现的目的是:有条理的保存和管理对象。why? 开发者想把对象一个一个存放到一个变量里面,想像操作变量一样操作对象,比如$arr=['zhangsan'=>3,'lisi'=>4];如果 能通过zhangsan,lisi这个键来操作对象岂不是美滋滋?那就能像操作变量一样操作对象了,unset等,巴适的很!下面讲解一下注册模式的基本例子 <?php class Registry { protected sta原创 2022-03-08 21:02:56 · 758 阅读 · 0 评论 -
设计模式-- 代理模式
代理模式其实生活中非常常见;在某些情况下,一个对象不合适或者不能直接调用另外一个对象,而代理对象可以在客户端和目标对象中起到中间人作用。场景一:程序员A喜欢一个女生不敢表白;就请了B带话给了女生,这会好了程序员A成功抱的美人归。中间者可能会得到一下好处比如被请吃饭了。(现实没这么好的😄)场景二:房产中介。一样的他们中间商赚差价,其实就是好处,代理模式经过了中间人代理,在系统代码级别上可以理解为性能消耗。优点:职责清晰,委托类只需关注自身功能实现即可(比如给钱即可);可拓展性强,代理对象介于客户和原创 2022-03-07 22:07:59 · 152 阅读 · 1 评论 -
设计模式--适配器模式 (类适配器和对象适配器)
适配器模式很常用的;商城中的例子比如快递发货,那么多种快递公司;可能每个快递公司的接口对接都不一样都要适配;比如各种框架中的类似以下思想的代码,都是为了适配。public function behaviors() { return array_merge(parent::behaviors(), [ 'login' => [ 'class' => LoginBehavior::className(),原创 2022-03-07 15:21:36 · 1830 阅读 · 0 评论 -
设计模式--抽象工厂模式
记得前面写过一篇简单工厂模式,那个是只针对一类产品的抽象,比如数据库一类的抽象;今天讲的是简单工厂模式的升级版!--抽象工厂模式。抽象工厂模式其实就是简单工厂模式的一个再一次的抽象而已;这次把比如:汽车工厂和衣服工厂再进行一次抽象,就是抽象工厂模式了!<?php/** * 汽车工厂类 */interface AbstractProductCart { /** * 取得产品名 */ public function getName();}/*原创 2022-03-05 20:55:18 · 238 阅读 · 0 评论 -
设计模式--工厂模式
提供一个工厂,需要制作啥产品,就传入那个产品的名称就可以产出那个具体的产品对象,无需爆出工厂内部是如何做出这个产品的具体步骤;比如一个汽车工厂类;你传入宝马他就做出宝马;你传人奔驰他就做出奔驰。在代码中使用场景:可以是数据库工厂类;或者支付方式工厂类等等。下面以数据库代码讲解一下<?php// 定义一个接口interface Db{ public function conn();}/** *@class 服务端开发(不知道谁将会被调用) * */class Db原创 2022-03-05 20:16:41 · 265 阅读 · 0 评论 -
设计模式--迭代器模式
php中foreach已经实现了迭代器模式;基本没啥好说的了,都内部实现了🙂原创 2022-03-05 19:39:20 · 140 阅读 · 0 评论 -
设计模式 -- 责任链模式
责任链模式对有很多if else的场景也非常适合,在项目中比如 对一个商城中不同的会员等级做出不一样的处理,然后各个等级处理返回重组返回相同数据结构的数据即可。生活中例子:比如你想请个假,需要你的主管同意,需要主管的上级同意,以此类推。优点:各个节点责任明确,处理不了就继续找上一级,比如上面的例子如果主管的上级都处理不了(可能是某个副总),那直接找老板请假去!备注:可以达到责任解耦;可拓展性强(对处理不了的事问上一级,在代码中的实现就是增加一个处理类即可);客户端调用无感知(比如客户让你写个合同原创 2022-03-05 19:28:59 · 232 阅读 · 0 评论 -
设计模式-- 观察者模式(坐牢模式)
观察者模式其实和坐牢差不多;被观察者(牢犯人),观察者(监狱长),当牢犯人有啥风吹草动立马通知监狱长,虽然不是很恰当,但是就是这么个意思,自己悟一下😄。没用设计模式的代码,这样的代码要是把最上面那部分也要符合要求加进来,就要修改代码,不符合宁增不改的原则。也就是想搞个新闻啥的,又得加代码去实现。比如:上面那是没使用 观察者模式的时候的代码,每次修改都要增加if来写代码,上面的方法实现简单加一下无妨,但是如果很复杂的话,就GG了,下面使用观察者模式实现一下<?php/** *原创 2022-03-05 18:53:58 · 284 阅读 · 0 评论 -
设计模式-- 模板方法模式(也叫订阅者模式)
模板模式先定义一个抽象类,然后在抽象类中定义个public方法 和 N个抽象方法(需要子类继承并且可以自己可以自己实现方法的详细逻辑的),最后在public方法调用抽象的方法(这样子类实例化之后可以直接调用抽象类的public方法)。逻辑的细节留给具体的子类去实现。上代码:<?phpabstract class AbstractClass { // 抽象模板角色 public function templateMethod() { // 模板方法 调用基本方法组装顶层逻辑原创 2022-03-05 18:25:06 · 122 阅读 · 0 评论 -
设计模式--单例模式
任何设计模式都是编程的一种产物,经验之谈。单例模式比如数据库连接老是重建的话会浪费资源;比如一个平台下每个商户的支付等配置信息都是单例模式去实现保证每次支付都是对应商户对应调用;再比如。。。。。常常用于允许在运行时为某个特定的类创建仅有一个可访问的实例。<?phpclass Singleton{ //私有属性,用于保存实例 private static $instance; //构造方法私有化,防止外部创建实例 private function __constr原创 2022-03-04 21:45:14 · 413 阅读 · 0 评论 -
设计模式--策略模式
策略模式(Strategy Pattern)定义了一组策略,分别在不同类中封装起来,每种策略都可以根据当前场景相互替换,从而使策略的变化可以独立于操作者。大家都写过这样的代码if (conditionA) { 逻辑1} else if (conditionB) { 逻辑2} else if (conditionC) { 逻辑3} else { 逻辑4}这种代码虽然写起来简单,但是很明显违反了面向对象的 2 个基本原则:单一职责原则(一个类应该只有一个原创 2022-03-04 21:02:02 · 84 阅读 · 0 评论