什么是设计模式?设计模式是指在软件开发过程中,被反复使用、经过优化、被广泛接受的一种编程**或者编程模式。设计模式能够提高软件开发的可维护性、可扩展性、可重用性、可读性等方面的特点,从而提高软件开发的质量和效率。设计模式是一种经过实践证明并具有普遍适用性的解决方案,它可以用来解决各种软件设计问题,避免重复造轮子。
现代编程无时无刻在使用用设计模式,学习前人的**,站在巨人肩膀上前行,这也是我们现代社会进步的宗旨。这个系列总共耗时半年之久,零零碎碎看看,零零碎碎整理,当然 “从 0 开始重学设计模式” 这个系列也是为后面系列 “手撕 Laravel 源码系列” 提供基础。
以前看完老容易忘,尝试着以自己的口吻说出来,其中 代码 和 UML 图都自己来实现。我认为如果自己能够举例证明这个模式,证明深入了解这个模式,模式忘记的时候,想一下自己举的例子,一下又记起来了(目前我就是这样),如:茶颜悦色的例子我就会想到 “装饰器模式”。
为了重学我先后从图书馆借了:《大话设计模式》、《深入设计模式》、《深入 PHP 面向对象、模式与实践》。
对这几本书我的评价如下:
程杰老师的《大话设计模式》浅显易懂,以白话文的形式展现出来,操练也简单,但不知为何我看完就如故事看完了一样,很难联系到具体的用途,过几天可能就忘记了。
《深入设计模式》这本书是由美国作者编写的,国人进行了翻译。我看的是电子档,本以为会翻译程度很差,具体看下来翻译很惊喜,一点美式风格都没有。写得非常棒,每种模式都会对上下文进总结,对各种模式组合也会距离,所以对设计模式深入还是一本非常不错的书。唯一不好之处就是几种设计模式距离晦涩难懂,从刚开始看不懂,这个模式你就基本看不懂了。
《深入 PHP 面向对象、模式与实践》不推荐,长时间没有更新新版本,PHP 相关的 OOP 细节还可以看一下,设计模式例子少,代码不新鲜。
综上几点,对于新手我推荐程杰老师的《大话设计模式》,对于想深入了解的可看《深入设计模式》,你也可以像我一样全选择两本一起看,《深入设计模式》看不懂的地方看《大话设计模式》,《大话设计模式》上下文不明白的地方看《深入设计模式》。
现在网上满天飞的“设计模式”,还有必要自己看书和自己实现吗?
非常有必要,你能看完并不代表你能看懂,你能看懂并不代表你能自己实现,你能自己实现并代表你能和别们说明白。所以我秉着:看懂=》做懂=》说懂 的原则,重新实操一遍。
设计模式有什么用?
设计模式其实你一直在用,只是不知道而已,我们现在使用的框架都是 OOP 框架,底层都帮我们封装好了,只是你并不需要去再去设计,只需按照规定使用了而已。但是你不会也很难写出优雅的代码。
- 提高代码的可维护性 设计模式提供了一种标准化的解决方案,使得代码更加清晰、易于理解和修改。
- 提高代码的可扩展性 设计模式可以让代码更加灵活、易于扩展,支持不同的变化需求。
- 提高代码的可重用性 设计模式提供了一种可复用的解决方案,避免了重复的开发工作。
- 提高代码的可读性 设计模式提供了一种标准化的编程风格和思路,使得代码更加易于阅读和理解。
- 提高软件开发的效率 设计模式提供了一种高效、经过实践验证的解决方案,可以避免开发人员花费大量时间和精力来开发和调试代码。
- 提高软件的质量 设计模式能够提高软件的可维护性、可扩展性和可重用性,从而提高软件的质量和稳定性。
创建型模式提供创建对象的机制, 增加已有代码的灵活性和可复用性。
- 简单工厂(SimpleFactory)
- 工厂方法(FactoryMethod)
- 抽象工厂(AbstractFactory)
- 生成器(Builder)
- 原型(Prototype)
- 单例(Singleton)
结构型模式介绍如何将对象和类组装成较大的结构,并同时保持结构的灵活和高效。
- 适配器(Adapter)
- 桥接(Bridge)
- 组合(Composite)
- 装饰(Decorator)
- 外观(Facade)
- 享元(Flyweight)
- 代理(Proxy)
行为模式负责对象间的高效沟通和职责委派。
- 责任链(Chain of Responsibility)
- 命令(Command)
- 迭代器(Iterator)
- 中介者(Mediator)
- 备忘录(Memento)
- 观察者(Observer)
- 状态(State)
- 策略(Strategy)
- 模板方法(Template Method)
- 访问者(Visitor)
一句口说一个模式,本总结摘抄于 《大话设计模式》OOTV 杯超级模式大赛-模式总结章节。
工厂方法,定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂模式使得一个类的实例化延迟到子类。
抽象工厂,提供一个创建一系列或相关依赖对象的接口,而无需指定它们具体的类。
建造者,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
原型,用原型实例指定创建对象的种类,并且通过拷贝这些原型创新的对象。
单例,保证一个类仅有一个实例,并提供一个访问它的全局访问点。
适配器,将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
桥接,将抽象部分与它的实现部分分离,使它们都可以独立地变化。
组合,将对象组合成树形结构以表示‘部分-整体’的层次,组合模式使得用户对单个对象和组合对象的使用具有一致性。
装饰,动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更加灵活。
外观,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
享元,为运用共享技术有效地支持大量细粒度的对象。
代理,为其他对象提供一种代理以控制这个对象的访问。
责任链,使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
命令,将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;可以对请求排队或记录请求日志,以及支持可撤销的操作。
迭代器,提供一种方法顺序访问一个聚合对象中各个元素,而不需暴露该对象的内部表示。
中介者,用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示得相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
备忘录,在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
观察者,定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
状态,允许一个对象在其内部状态改变时改变它的行为,让对象看起来似乎修改了它的类。
策略,定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
模版方法,定义一个操作的算法骨架,而将一些步骤延迟到子类中,模版方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
访问者,表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
解释器,给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。