设计模式23种范例

设计模式23种范例

PHP常用设计模式包括(单例,工厂,注册,观察者,适配器,策略,装饰器,原型)

模式介绍

设计模式:提供了一种广泛的可重用的方式来解决我们日常编程中常常遇见的问题。设计模式并不一定就是一个类库或者第三方框架,它们更多的表现为一种思想并且广泛地应用在系统中。它们也表现为一种模式或者模板,可以在多个不同的场景下用于解决问题。设计模式可以用于加速开发,并且将很多大的想法或者设计以一种简单地方式实现。当然,虽然设计模式在开发中很有作用,但是千万要避免在不适当的场景误用它们。

主要区分为三种类别

  • 创建型模式
  • 结构型模式
  • 行为型模式

创建型模式

创建型模式包括了一下五种:工厂模式,抽象工厂模式,单例模式,建造者模式,原型模式。

  • 工厂模式

    将消费者类与工厂类分开。消费者需要某种产品的时候,只需向工厂发送请求即可。消费者无需修改就可以接收新产品。缺点是产品修改时,工厂也要修改。

  • 抽象工厂模式

    核心工厂不再负责所以产品的创建,而是将具体的创建分给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不用去接触那个产品类应当被实例化这种细节

  • 建造者模式

    举例:要对不同地区的女孩子说“我爱你”,那我有一个多种语言翻译机,每种语言都有一个按钮,我遇见人只需要按对应的键,它就能够说出对应语言的话。

    定义:将产品内部表象和产品的生产过程分割,从而使一个建造过程生成具有不同的内部表象的产品对象

  • 原型模式

    举例:和女孩子说话一定要说深情的话,而我收集了很多深情的话,我只需要copy出来讲就行了。

    定义:通过给出一个原型对象来指明所要创建的对象的类型,然后复制这个原型对象的方法创建出更多同类型的对象(用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象

  • 单例模式

    举例:我有6个老婆,她们的老婆都是我,我就是我们家里的老公Sigleton(单件,单例),当她们叫老公的时候都是只指我一个人。

    定义:该模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例单例模式。

结构型模式

结构型模式包含了代理、适配器、桥接、装饰、外观、享元、组合7种模式。

  • 适配器模式

    举例:在聚会上碰到一个美女,从外地来的,可我不会说粤语,她不会说普通话,只好求助我的朋友A。而A作为我和美女之间的Adapter,让我和美女能够相互交谈

    定义:把一个类的接口变成客户端所期待的另一种接口,从而使原本因接口原因不匹配而无法一起工作的两个类能一起工作。

  • 桥接模式

    举例:详细案例

    如果要定义一个未知颜色+未知形状的图形,可以使用此方式,先创建颜色的抽象类,满足不同颜色需求,再创建形状抽象类

    定义:将抽象化与实现化脱耦,使两者可以独立的变化。

  • 装饰器模式

    定义:装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,提供比继承更多的灵活性。(动态给一个对象增加功能,这些功能可以再动态的撤销。增加由一些基本功能的排练组合而产生的非常大量的功能)

  • 代理模式

    举例:跟网友聊天一开始总是‘你好’,‘hi’这些话,于是我做了个程序Proxy(代理),凡是接收到这些话就自动返回设置好的回答,接收这些之外的话再通知我回答。

    定义:给某一个对象提供一个代理对象,并由代理对象控制对源对象的引用(为其他对象提供一种代理以控制对这个对象的访问)

  • 组合模式

    将对象组织到树结构中,可以用来描述整体与部分的关系·(将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性)
    详细案例

  • 外观模式

    举例:我有一个相机,我自己用的时候喜欢手动设置功能,但给女朋友用的时候她不会,这个时候幸好相机有Facade(外观设计模式),能自动将相机设置为自动挡,只需要按快门,一切由相机自动调整。

    定义:外部与一个子系统的通信必须通过一个统一的Facade对象进行。外观模式只为系统中的某一层或子系统提供单一 入口, 能够帮助我们解耦项目中的不同部分,客户端只需调用一些简单方法,而不需要了解子系统的内部函数。详细案例

  • 享元模式

    定义:以共享的方式高效的支持大量的细粒度对象。(拆分来看即‘享’为共享,‘元’为元素,共享某些元素)详细案例

行为型模式

行为型模式包括责任链、命令、解释器、迭代器、中介者、备忘录、观察者、状态、策略、模板、访问者11种模式

  • 责任链模式

    举例:我在最后一排,前面有很多漂亮的女孩,我写了一张纸条“hello,可以做我女朋友吗,如果不喜欢请往上面继续传”。

    定义:在该模式中,很多对象由每一个对象对其下家的引用而接起来形成一条链(使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象练成一条链,并沿着这条链传递该请求,直到有一个对象除了它为止)详细案例

  • 命令模式

    举例:我有一个妹妹家里很严,无法联系,只能借助于他的弟弟在我们之间传递信息,她对我有什么指示就写一张纸条叫弟弟带给我。弟弟带的纸条可以给很多人。(妹妹是下达者,弟弟是接收者,纸条为命令,我和其他人为执行者)

    定义:把一个请求或者操作封装到一个对象中。命令模式把发出命令的责任和执行命令的责任分隔开,委派给不同的对象。(将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作)

  • 解释器模式(无深入了解)

    举例:我有个<约会手册>,上面有各种约会攻略,我在外约会的时候,只需要做一个Interpreter(解释器),照着上面的脚步执行就可以了

    定义:给定一个语言后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子(每一个命令对象都有一个解释方法,代表对命令对象的解释。)

  • 迭代器模式

    定义:该模式可以顺序访问一个聚集中的元素而不必暴露聚集的内部表象。多个对象聚在一起形成的总体称之为聚集,聚集对象是能够包容一组对象的容器对象。(迭代器模式是遍历集合的成熟模式,迭代器模式的关键是将遍历集合的任务交给一个叫做迭代器的对象,它的工作时遍历并选择序列中的对象,而客户端程序员不必知道或关心该集合序列底层的结构。)详细案例

  • 中介者模式

    举例:四个美女打麻将,相互之间给钱算不清楚了,正好我在旁边,我按照各自筹码数钱,赚了钱的从我这里拿,输了钱的就付给我。

    定义:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式得相互作用,从而使其耦合松散,而且可以独立地改变他们之间的交互。(该模式适合做通讯产品,中介者适用于一组对象以定义良好但是复杂的方式进行通信的场合,以及想定制一个分布在多个类中的行为,而又不想生成太多子类的场合)详细案例

  • 备忘录模式

    举例:跟几个美女聊天,一定要记住刚才跟美女说了什么话,幸好我有一个备忘录,刚才跟那个美女说了什么话我都拷贝一份到备忘录里面保存。

    定义:备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。(备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捉住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态)详细案例

  • 观察者模式

    举例:想知道最新的MM情报,直接加入公司的MM情报邮件组,tom负责收集情报,他发现的新情报不用一个一个通知我们,直接发给邮件组,我们作为订阅者(观察者)就可以及时收到情报。

    定义:(即发布-订阅模式)该模式定义了一种一对多的依赖关系,让多个订阅者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所以观察者对象,使他们能够自动更新自己。详细案例

  • 状态模式

    举例:跟MM交往时,一定要注意她的回复状态。比如约她看电影,不喜欢你的会说:有事情,对你不讨厌但没到喜欢的会说:好啊,可以带上我一个朋友吗,对你有好感的会说:几点钟?看完再吃个饭?。

    定义:该模式允许一个对象在其内部状态改变的时候改变行为,这个对象看上去像是改变了它得类一样。(该模式的意图是让一个对象在其内部状态改变时,其行为也随之改变。状态模式需要对一个系统可能取得的状态创立一个状态类的子类。当系统的状态变化时,系统便改变所选的子类)(定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所以依赖于它的对象都得到通知并自动更新)详细案例

  • 策略模式

    举例:跟不同类型的MM约会,要用到不同的策略,有的请电影比较好,有的则去吃小吃效果不错,有的去海边浪漫合适,但我们的目的都是为了得到MM的芳心,我的追MM锦囊中有好多策略(Strategy)

    定义:该模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。(该模式使得算法可以在不影响到客户端的情况下发生。它把行为和环境分开。环境类负责维持和查询行为类,各种算法在具体的策略中提供。由于算法和环境独立开来,算法的增减,修改都不会影响到环境和客户端)(本模式可以使得算法可独立于使用它的客户而变化)详细案例

  • 模板方法模式

    举例:《如何说服女生上床》这部经典文章讲述了女生从认识到上床的不变的步骤分为巧遇、打破僵局、展开追求、接吻、前戏、动手、爱抚、进去八大步骤(template method)。但每个步骤针对不同的情况,都有不一样的做法,这就要看你的随机应变了(具体实现)

    定义:该方法准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。(不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。先制定一个顶级逻辑框架,而将逻辑的细节留给具体的子类去实现)详细案例

  • 访问者模式

    举例:情人节到了,要给每个MM送一束鲜花和一张卡片,可是每个MM送的花和卡片都要针对她的个人特点来挑,我一个人搞不清楚。于是我找花店和礼品店老板做一下visitor,让他们根据每个妹妹的特点来制作,这样就轻松多了。

    定义:主要将数据结构与数据操作分离(该模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构可以保持不变,该模式适用于数据结构相对未定的系统,它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由。该模式使得新增的操作变得很容易,就是增加一个新的访问者类。该模式将有关的行为集中到一个访问者对象中,而不是分散到一个个的节点类中,当使用访问者模式时,要将尽可能多的对象浏览逻辑放在访问者类中,而不是放到它的子类中)详细案例

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值