# 设计模式
计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
项目中合理地运用设计模式可以解决很多问题,每种模式都描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是设计模式能被广泛应用的原因。
何时使用:敏捷开发原则告诉我们,不要为代码添加基于猜测的、实际不需要的功能。如果不清楚一个系统是否需要某种设计模式,一般就不要着急去实现它,事实上,在需要的时候通过重构实现它并不困难,只有在真正需要它的时候才去使用它,这样才有意义。
只要真正的理解了面向对象的设计原则,很多设计模式其实就是原则的应用而已,或许在不知不觉中就在使用设计模式了。
# 面向对象
基本概念
- 面向对象:面向对象是种具有对象概念的编程典范,它通过将需求要素转化为对象进行问题处理,同时也是一种程序开发的抽象方针。
- 类:定义了事物的属性和它可以做到的行为
- 对象:类的具体实例
主要思想
- 分而治之:将一个大的需求分解为许多类,每个类处理一个独立的模块
- 拆分的好处:独立模块便于分工,每个模块便于复用,可扩展性强
- 封装变化:变化的地方独立封装,避免影响其他模块
- 复杂的实现封装在内部,对外提供简单的调用
- 高内聚:类中各个方法都在完成一项任务(单一职责的类)
- 低耦合:类与类的关联性依赖度要低(每个类独立)
- 让一个模块的改变,尽少影响其他模块
基本特征
- 封装:封装是对象和类概念的主要特性。封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏
- 继承:继承可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。通过继承创建的新类称为 “子类” 或 “派生类”,被继承的类称为 “基类”、“父类”、“超类”
- 多态:多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针
- 实现多态,有两种方式,覆盖和重载。覆盖和重载的区别在于,覆盖在运行时决定,重载是在编译时决定。并且覆盖和重载的机制不同,例如在 Java 中,重载方法的签名必须不同于原先方法的,但对于覆盖签名必须相同
类的四大关系
- 泛化:子类与父类的关系,概念的复用,耦合度最高;B 类泛化 A 类,意味 B 类是 A 类的一种
- 做法:B 类继承 A 类
- 实现:抽象行为的具体实现,两者体现功能的关系,变化只影响行为;A 类实现 B 类,意味 A 类必须具体实现 B 类中所有抽象成员
- 做法:实现抽象类、接口中的抽象成员
- 关联(聚合 / 组合):部分与整体的关系,功能的复用,变化影响一个类;A 与 B 关联,意味着 B 是 A 的一部分
- 做法:在 A 类中包含 B 类型成员
- 依赖:合作关系,一种相对松散的协作,变化影响一个方法;A 类依赖 B 类,意味 A 类的某些功能靠 B 类实现
- 做法:B 类型作为 A 类中方法的参数,并不是 A 的成员
# 设计模式的六大原则
- 开闭原则(Open Close Principle)
开闭原则的意思是:对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。 - 里氏代换原则(Liskov Substitution Principle)
里氏代换原则是面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。LSP 是继承复用的基石,只有当派生类可以替换掉基类,且软件单位的功能不受到影响时,基类才能真正被复用,而派生类也能够在基类的基础上增加新的行为。里氏代换原则是对开闭原则的补充。实现开闭原则的关键步骤就是抽象化,而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。 - 依赖倒转原则(Dependence Inversion Principle)
这个原则是开闭原则的基础,具体内容:针对接口编程,依赖于抽象而不依赖于具体。 - 接口隔离原则(Interface Segregation Principle)
这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。它还有另外一个意思是:降低类之间的耦合度。由此可见,其实设计模式就是从大型软件架构出发、便于升级和维护的软件设计思想,它强调降低依赖,降低耦合。 - 迪米特法则,又称最少知道原则(Demeter Principle)
最少知道原则是指:一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。 - 合成复用原则(Composite Reuse Principle)
合成复用原则是指:尽量使用合成 / 聚合的方式,而不是使用继承。
# 设计模式的类型
设计模式可以分为三大类:创建型模式(Creational Patterns)、结构型模式(Structural Patterns)、行为型模式(Behavioral Patterns)
模式 | 描述 |
---|---|
创建型模式 | 关注对象的创建,旨在解决如何更加灵活的创建对象 |
结构型模式 | 关注对象之间的组合和关系,旨在解决如何构建灵活且可复用的类和对象结构 |
行为型模式 | 关注对象之间的通信和交互,旨在解决对象之间的责任分配和算法的封装 |