设计模式简要及其七大原则详解
设计模式
简介
解决软件开发某些特定问题而提出的解决方案或解决问题的思路,通过设计模式帮助我们增加代码的可重用性,可读性(编程规范性)可靠性(增加新功能后对原功能无影响),可扩展性(增加新功能非常方便),灵活性,设计模式最终的目的是实现代码的高内聚(模块内部是紧密的),低耦合(两个模块的依赖性低)。
设计模式在软件中哪里?
面向对象[oo]=>功能模块[设计模式+算法]=>框架[使用到多种设计模式]=>架构[服务器集群]
核心思想
- 找出应用中可能需要变化之处,把他们独立出来,不与不会发生变化的代码混合在一起。
- 针对接口编程,而不是针对实现编程。
- 为交互对象之间的低耦合设计而努力。
分类
创建型模式:
解释:对象实例化的模式,创建型模式用于解耦对象的实例化过程
包括:单例模式,抽象工厂模式,原型模式,建造者模式,工厂模式
结构型模式:
解释:把类或对象结合在一起形成一个更大的结构
包括:适配器模式,桥接模式,装饰模式,组合模式,外观模式,享元模式,代理模式
行为型模式:
解释:类和对象如何交互,及划分责任和算法
包括:模板方法模式,命令模式,访问者模式,迭代器模式,观察者模式,中介者模式,备忘录模式,解释器模式,状态模式,策略模式,职责链模式(责任链模式)
设计模式七大原则
单一职责原则,开闭原则,里氏代换原则,依赖倒转原则,接口隔离原则,合成复用原则,迪米特法则
单一职责原则
- 注意事项:
- 降低类的复杂度,一个类只负责一项职责
- 提高类的可读性,可维护性
- 降低变更引起的风险
- 通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可以在类级,违反单一职责原则:类中方法数量足够少,可在方法级别保持单一职责原则。
开闭原则(ocp原则)
软件实体对扩展是开放的,但对修改是关闭的,即在不修改一个软件实体的基础上去扩展其功能。
- 基本介绍
- 开闭原则(open closed principle)是编程中最基础最重要的设计原则
- 一个软件实体类,模块和函数应该对扩展(提供方)开放,对修改(使用方)关闭。用抽象构建框架,用实现扩展细节。
- 软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化。
- 使用设计模式的目的就是遵循开闭原则。
- 请问
里氏替换原则
软件系统中一个可以接受基类对象的地方必然可以接受一个子类对象
-
继承的思考和说明
- 父类中已经实现好的方法,实际上是设定规范和契约,虽然不强制要求所有的子类必须遵守,但是子类对这些已经实现的方法任意修改,会对整个继承体系造成破坏
-
继承的弊端
- 继承会给程序带来侵入性,程序的·可移植性降低,增加对象之间的耦合性
- 若一个类被其他的类所继承,当这个类需要修改时,必须考虑到它的所有子类,且父类修改后涉及到的子类功能可能产生故障。
-
遵守里氏替换原则
子类尽量不要重写父类方法,若一定要重写不要使用继承,使用组合内聚等方式。
依赖倒转原则
-
基本介绍
- 要针对抽象层编程而不要针对具体类编程。
- 高层模块不应该依赖底层模块,二者都应该依赖其抽象。
- 抽象不应该依赖细节,细节应该依赖抽象
- 依赖倒转的中心思想是面向接口编程。
-
设计理念
- 相对于细节的多变性,抽象的东西要稳定得多,在java中抽象指的是接口或抽象类,细节就是具体的实现类
- 使用接口和抽象类的目的是定义好规范,而不涉及任何具体的操作,将展现细节的任务教给他们的实现类去完成。
-
依赖关系传递的三种方式
-
接口传递
- 将总接口所依赖的子接口充当总接口中的普通方法参数传递给总接口
- 依赖接口的作用范围为总接口的某一方法内部
-
构造方法传递
-
将子接口定义为总接口的全局属性
-
将子接口充当总接口构造方法参数赋值给总接口的全局属性
-
依赖接口的作用范围为总接口的全局
-
-
setter方式传递
- 将子接口定义为总接口的全局属性
- 通过setter方法为其赋值。
- 依赖接口的作用范围为总接口的全局
-
-
注意事项
- 底层模块尽量都有抽象类或接口,或两者都有程序稳定性更好。
- 变量的声明类型尽量都是抽象类或接口,使得变量引用与实际对象之间存在缓冲层,利于程序扩展和优化。
- 继承遵循里氏替换原则。
-
啊飒飒大苏打
接口隔离原则
- 基本介绍
- 使用多个专门的接口来取代一个统一的接口
- 客户端不应该依赖它不需要的接口,及一个类对另一个类的依赖应该建立在最小接口上。
合成复用原则(*)
基本介绍
在系统中尽量多使用组合聚合关联关系,少使用甚至不使用继承关系。
依赖:将A类充当B类中某一方法的参数使用
聚合:将A类作为B类的成员变量,通过setter的方式将其实例化,赋值。
组合:将A类作为B类的成员变量,定义时直接实例化A。
迪米特法则
一个软件的实体对其他实体的x越少越好,或者说如果两个类不必彼此直接通信那么两个类不应当发生直接的相互作用,而是通过第三者发生简介交互。
-
基本介绍
-
一个对象应该对其它对象保持最少的了解
-
类与类关系越密切,耦合度越大
-
迪米特法则又叫最少知道原则,即一个类对自己依赖的类知道的越少越好。也就是说对于被依赖的类不管多复杂,暴露接口隐藏实现细节,不对外透露多余的信息。
-
迪米特法则简单的定义:只与直接的朋友通信
-
直接朋友:两对象间存在耦合关系(依赖,关联,组合,聚合……),就称其为朋友;
我们称出现直接变量,方法参数,方法返回值中的类为直接朋友。
出现在局部变量中的类不是直接朋友。
-
-
注意事项
- 迪米特法则的核心:降低类之间的耦合
- 由于每个类都减少了不必要的依赖,迪米特法则只是要求降低类间(对象间)耦合关系,并不是要求完全没有依赖关系。