设计模式概论综述
问题本身不是问题,如果应对问题才是问题,进入it这个行业,对于一个数学一直无爱的人来说,最大的意外就是发现数学之美,算法之美,模式之美。人类的思维和知识传承之美。从入行到现在匆匆多年,多次从设计模式之门之前晃一眼就走了,一直没有深入去了解,其实更多的是为了学习而学习,这样不好,要带着问题,带着场景去学习才是现在最好的学习方案,毕业这么多年已不再是哪个有时间通篇可以学一门知识的时候了,时间很宝贵,精力有限。带着问题,带着场景去思考才是最好的方案。在设计模式和网站架构方面可以找寻各种适应的场景才是目标。
1:什么是设计模式
其实概念性的东西最讨厌了,但是总结的好确实能让人更好的理解。
教科书的说法:
设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结
模式是在某种情景下,针对某问题的某种解决方案。情景是应用某个模式的情况,应该是不断出现的情况;问题就是在某个情景下你想要达到的目标,但也可以是某情景下的约束;解决方案就是你所追求的,一个通用的设计,用来解决,约束,达到目标。如果你发现你自己处于某个情景下,面对着所欲达到的目标被一群约束影响的问题,然而你能够应用某个设计,克服这些约束并达到该目标,将你领向某个解决方案。
按照个人的理解其实跟算法有一些通性,算法是具体的指令,而模式是方案都是能够解决某种场景下的问题,其实都是总结的产物,算法是针对具体的实现问题,有时间复杂度,空间复杂度等指标,而模式有自己的设计原则按照我的理解,模式的原则标准其实跟算法相似,就是在开发上面的”时间复杂度“和”空间复杂度“等特性的优劣程度。
设计模式跟OOP有着千丝万缕的关系,这里简单说下OOP中抽象,封装,继承,多态的概念(定义是什么不重要,重要的是要有自己的理解,能用自己的方式表达)
- 抽象 面对信息可以忽略其中某些方面,关注通用的共性。生活中很多的概念都是抽象出来的,基本的定义很多都涉及到抽象,例如“腿”这个概念,动物基本都有,但是有的也没有,每个的数量和树形都不同,但是我们的认知中都称之为腿。
- 封装 也叫做信息封装,确保组件不会以不可预期的方式改变其它组件的内部状态;只有在那些提供了内部状态改变方法的组件中,才可以访问其内部状态。每类组件都提供了一个与其它组件联系的接口,并规定了其它组件进行调用的方法。在实现上面就是类的具体的方法的实现。
- 继承,子类就会继承父类所有公有的和受保护的方法,除非子类覆盖了父类的方法,被继承的方法都会保留其原有功能
- 多态 实例会牵涉到不同的组件(状态,变量,信息),实例引用的结果将根据不同的组件而变得不同
2:设计模式中的原则
设计模式没有用像算法里面复杂度这么明确的指标,但是有一些原则可以提供指导
- 封装变化-找出应用中可能需要变化之处,把他们独立出来,不要把他们和不需要变化的代码混在一起。
- 多用组合,少用继承
- 针对接口编程,不针对实现编程
- 为交互对象之间的松耦合设计而努力
- 类应该对扩展开放,对修改关闭
- 依赖抽象,不要依赖具体类
- 最少知识原则,只和你的密友交谈。只和朋友交谈,
- 别找我,我会找你,别调用我们,我们会调用你,底层组件不能调用高层组件。高层组件可以调用底层组件。
- 类应该只有一个改变的理由,一个类应该只有一个引起变化的原因。
3:设计模式目录及具体实现
这边先一些常用的模式归纳下,稍后会有对应的相应的详细的篇章实现每一个模式 第一版先基于PHP语言,
策略模式-定义算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
定义:策略模式定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
观察者模式-让你的对象知悉现况
定义:观察者模式定义了对象之间一对多的依赖,这样以来,当一个对象改变状态时,它的所有依赖着都会收到通知并且自动更新
装饰者模式-装饰对象
定义:动态的将责任附加到对象上,若要扩展功能,装饰着模式提供了比继承更有弹性的替代方案
工厂模式-烘烤OO的精华
定义:工厂方法模式定义了一个创建对象的接口,但由子类决定要实例话的类是哪一个,工厂方法让类把实例化推迟到子类。
抽象工厂方法
定义:抽象工厂方法提供一个接口,用于创建相关或依赖对象的家族,并不需要明确指定具体类。
单件模式-独一无二的对象
定义:单件模式确保一个类只有一个实例,并提供一个全局访问点。
命令模式-封装调用
定义:命令模式将“请求”封装成对象,以便使用不同的请求,队列或者日志来参数化其他对象,命令模式也支持可撤销的操作。
适配器和外观模式-随遇而安
适配器模式
定义:适配器模式将一个类的接口转换成客户期望的另一个接口,适配器让原本不兼容的类可以合作无间。
外观模式
定义:外观模式提供了一个统一的接口,用来访问子系统中的一群接口,外观定义了一个高层接口,让子系统更容易使用。
模版方法模式-封装方法
定义:模版方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,模版方法使得子类可以在不改变算法结构情况下,重新定义算法中的某些步骤。
迭代器和组合模式-管理良好的集合
迭代器
定义:迭代器模式提供了一种方法顺序访问一个聚合对象中的各个元素,而不暴漏其内部的表示
组合模式
定义:组合模式允许你将对象组合成树形结构来表现“整体/部分”层次结构,组合模式能让客户以一致的方式处理个别对象以及对象组合。
状态模式-事物的状态
定义:状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。
代理模式-控制对象访问
定义:代理模式为另一个对象提供一个替身或占位符以控制对这个对象的访问。
复合模式-模式中的模式
定义:复合模式结合两个或以上的模式,组成一个解决方案,解决一再发生的一般性问题。
PS:本文主要参考《设计模式-HeadFirst》一书,相应定义性的总结,这边就不班门弄斧了,设计模式的概念可能在不同的书或者文章中有差异,但是核心思想是相似的。