设计模式-概述
                    
                
            设计模式是软件设计中常见问题的典型解决方案。设计模式与方法或库的使用方式不同,你很难直接在自己的程序中套用某个设计模式。
模式并不是一段特定的代码,而是解决特定问题的一般性概念。
你可以根据模式来实现符合自己程序实际所需的解决方案。
模式的历史
设计模式并不是晦涩的、复杂的概念,事实恰恰相反。模式是面向对象设计中常见问题的典型解决方案。同样的解决方案在各种项目中得到了反复使用,所以最终有人给它们起了名字,并对其进行了详细描述。
1994 年,出版的《设计模式: 可复用面向对象软件的基础》一书,将设计模式的概念应用到程序开发领域中。该书提供了 23 个模式来解决面向对象程序设计中的各种问题。由于书名太长,人们将其简称为 GoF。
为什么以及如何学习设计模式
- 设计模式是针对软件设计中常见问题的工具箱,其中的工具就是各种经过实践验证的解决方案。即使你从未遇到过这些问题,了解模式仍然非常有用,因为它能指导你如何使用面向对象的设计原则来解决各种问题
 - 设计模式定义了一种让你和团队成员能够更高效沟通的通用语言。
 
关于模式的争议
设计模式自其诞生之初似乎就饱受争议。
- 一种针对不完善编程语言的蹩脚解决方案。通常当所选编程语言或技术缺少必要的抽象功能时,人们才需要设计模式。例如,策略模式在绝大部分现代编程语言中可以简单地使用 lambda 来实现
 - 低效的解决方案。许多人会将这样的统一化认为是某种教条,而不会根据项目的实际情况对其进行调整,要注意,设计模式是问题的解决方案,而不是用解决方案来发现问题
 - 不当使用。如果你只有一把铁锤,那么任何东西看上去都像是钉子。
 
设计模式分类
模式可以根据其意图或目的可以分为三类:
- 创建型模式(Creational Design Patterns): 提供创建对象的机制,增加已有代码的灵活性和可复用性
 - 结构型模式(Structural Design Patterns): 介绍如何将对象和类组装成较大的结构,并同时保持结构的灵活和高效
 - 行为型模式(Behavioral Design Patterns): 负责对象间的高效沟通和职责委派
 
创建型模式
创建型模式有:
- 工厂方法 Factory Method
 - 抽象工厂 Abstract Factory
 - 生成器 Builder
 - 原型 Prototype
 - 单例 Singleton
 
结构型模式
- 适配器 Adapter
 - 桥接 Bridge
 - 组合 Composite
 - 装饰器 Decorator
 - 外观 Facade
 - 享元 Flyweight
 - 代理 Proxy
 
行为型模式
- 责任链 Chain of Responsibility
 - 命令 Command
 - 迭代器 Iterator
 - 中介者 Mediator
 - 备忘录 Memento
 - 观察者 Observer
 - 状态 State
 - 策略 Strategy
 - 模板方法 Template Method
 - 访问者 Visitor
 
面向对象设计原则
设计原则要比设计模式更重要。我们之后要讲的模式其中有的已经不重要了,实际应用非常少,有些已经被替代了。而设计原则在我们设计过程中是贯穿始终的。所有的设计模式都是根据设计原则进行抽象。设计原则是尺子,用于指导面向对象的设计。
- 依赖倒置原则: 高层模块(稳定)不应该依赖于低层模块(变化),二者都应依赖于抽象(稳定)
 - 开闭原则: 对扩展开放,对修改封闭
 - 单一职责原则: 一个类应该仅有一个引起他变化的原因
 - 里氏代换原则: 子类必须能够替换他们的基类
 - 接口隔离原则: 接口应该小而完备
 - 优先使用对象组合而不是类继承: 类继承为白箱复用,对象组合为黑箱复用,继承在某种程度破坏了封装,子类父类耦合度高,而组合只要求被组合对象具有良好定义的接口
 - 封装变化点: 使用封装来创建对象之间的分界层
 - 针对接口编程而不是针对实现编程: 不要将变量声明为具体类,而应声明为某个接口
 
接口标准化是产业强盛的标志(秦的统一、活字印刷、汽车制造)。