设计模式——个人总结
一、代码质量的评价标准
-
可维护性:在不破坏原有代码设计,不引入新的bug的情况下能够快速的修改或者添加代码。
“代码不易维护”:指修改或者添加代码需要冒着极大的引入新的bug的风险,并且花费很大的时间才能完成。 -
可读性:是评价代码质量最重要的指标之一。
编码规范、命名、注释、函数长短、模块划分、高内聚低耦合。 -
可扩展性:在不修改或少量修改原有代码的情况下,通过扩展的方式添加新的功能。
对扩展开发,对修改关闭 -
灵活性:易扩展、易复用、易用
-
简洁性:思从深而行从简,KISS原则
-
可复用性:尽量减少代码重复编写,复用已有代码
-
可测试性
总结:代码质量的评判标准有很多,它们之间是有相互作用的,并不是独立的,如代码的可读性好、可扩展性好就意味着代码的可维护性好,代码质量的高低是一个综合各种因素得到的结论,并不能通过单一维度去评价一段代码的好坏,而想要写出高质量代码,就要掌握一些更加细化的编程方法论,这其中包括:面向对象的设计思想、设计原则、设计模式、 编码规范及重构技巧等。
二、设计思想
现在,主流的编程范式或编程风格有三种:面向过程,面向对象和函数式编程。而面向对象是最主流的,因其具有丰富的特性(封装,抽象,继承、多态)。可以实现很多复杂的设计思路,是很多设计原则、设计模式、编码实现的基础。
面向对象四大特性:
- 封装:叫作 信息隐藏或者数据访问保护,主要讲如何隐藏信息,保护数据。
- 抽象: 抽象则是讲如何隐藏方法的具体实现。让使用者只需关心方法提供哪些功能,不需要知道功能是如何实现的。
- 继承:是用来表示类之间的is-a关系,主要用来解决代码复用的问题。而对应的接口是表示类之间的has-a关系,为了解决抽象而非代码复用的问题。
- 多态是指子类可以替换父类,子类可以具有不同的数据类型或表现出不同的行为。多态可以提高代码的扩展性和复用性。
编程风格:
面向对象是以类或对象作为组织代码的基本单元,强调万事万物皆对象。而面向过程是以过程(方法,函数操作)作为组织的基本单元。
不管使用哪种风格写代码,最终目的都是写出易维护、易读、易复用、易扩展的高质量代码,只要能避免其中的一些弊端,控制好副作用,也是可以不避讳在面向对象编程中融入面向过程的代码风格。
编程过程中应时刻具备基于接口实现编程这条原则,可以将接口和实现相分离,封装不稳定的实现暴露稳定的接口上游系统面对接口而非实现编程,当时现发生变化的时候,上游系统基本不需要做改动,以此来降低耦合性,提高扩展性。
- 面向对象分析(OOA)就是要搞清楚做什么;
- 面向对象设计(OOD)就是要搞清楚怎么做;
- 面向对象编程(OOP)就是讲分析和设计的结果翻译成代码的过程。
详细笔记查看:设计模式——设计思想
三、设计原则
1、SRP单一职责原则:指一个类只负责完成一个职责或者功能。
2、OCP开闭原则:对扩展开放,对修改关闭。
3、LSP里氏替换原则:按照协议来设计。子类可以改变函数的内部实现逻辑,但不能改变函数原有的输入、输出、异常的约定。
4、ISP接口隔离原则:客户端不应该被强迫依赖他不需要的接口。提供了一种判断接口的职责是否单一的标准。
5、DIP依赖反转(倒置)原则:跟控制反转有点类似,主要用来指导框架层面的设计。
6、KISS原则:尽量保持简单。
YAGNI原则:不要编写当前用不到的代码。
7、DRY原则:不要写重复代码。
8、LOD迪米特法则:减少类之间的耦合,让类越独立越好。
详细笔记查看:设计模式——设计原则
四、设计模式
1、创建型设计模式:主要用于解决”对象创建“问题,封装复杂的创建过程,解耦对象的创建代码和使用代码。
- 单例模式:用来创建全局唯一的对象,一个类只允许创建一个对象(实例)
- 工厂模式:用来创建不同但是相关类型的对象(继承同一父类或接口的一组子类),由给定的参数来决定创建哪种类型的对象。
- 建造者模式:用来创建一种类型的复杂对象,通过设置不同的可选参数,“定制化”的创建不同对象。
- 原型模式:用于在对象的创建或成本比较大,而同一个类的不同对象之间差别不大(比如对象中的数据需要经过复杂计算得到),则可对已有对象(原型)进行复制(拷贝)的方式。
详细笔记查看:设计模式——创建型
2、结构性设计模式:主要用于解决“类或对象的组合或组装”的问题。
- 代理模式:在不改变原始类接口的条件下,为原始类定义一个代理类。主要目的是控制访问,而非加强功能。(主要是接活,交给幕后被代理者干)
- 桥接模式:目的是将接口部分和实现部分分离,从而让她们可以较为容易,也相对独立地加以改变。
- 装饰器模式:在不改变原始类接口的情况下,对原始类功能进行增强,并且支持多个装饰器的嵌套使用,主要解决继承关系过于复杂的问题。
- 适配器模式:代理模式和装饰模式提供与原始类相同的接口,而适配器提供与原始类不同的接口。称为“事后补救策略”,将不兼容的接口转为可兼容的接口。
- 门面模式:用于封装细粒度的接口,提供组合各个细粒度接口的高层次接口,来提高接口的易用性,解决性能、分布式事务等问题(包裹多个接口成新的接口供使用者使用)
- 组合模式:主要用于处理树形结构数据(如文件系统等)
- 享元模式:目的是复用对象,节省内存,前提是享元对象是不可变对象。
详细笔记查看: 设计模式——结构型
3、行为型设计模式:主要用来解决“类或对象之间的交互”问题。
- 观察者模式:将观察者与被观察者代码解耦。
- 模板模式:在一个方法中定义一个算法骨架,并将某些步骤推迟到子类中实现。
- 策略模式:用来解耦策略的定义、创建、使用。让每个部分不至于过复杂。
- 职责链模式:用来解耦请求的发送和接收。
- 迭代器模式:用于解耦容器代码和遍历代码。
- 状态模式:用来实现状态机。
- 访问者模式:解耦操作和对象本身。
- 备忘录模式:主要用来防丢失、撤销、恢复等。
- 命令模式:用来控制命令的执行。
- 解释器模式:为某个语言定义它的语法,并定义一个解释器来处理这个语法。
- 中介者模式:通过引入中介这个中间层,将一组对象之间的交互关系,从多对多的关系转换为一对多(星状)关系。
详细笔记查看:设计模式——行为型
五、个人总结
《设计模式之美》结合实际开发业务场景来讲解各种设计模式的应用场景及其设计思想,强调设计模式的初衷是提高代码质量,重点是掌握应用场景及其能解决哪些问题,而非记忆定义及代码实现。
《您的设计模式》结合生活中的事件为例子讲解代码实现,语言通俗易懂、有趣,代码实现也比较浅显易懂,将生活事件与代码相结合更加深刻的了解设计模式的使用方式及代码实现。
一个月的时间把这两本书粗略的看了一遍,主要以《设计模式之美》为主,《您的设计模式》为辅,懂得了应用设计模式主要是为了应对代码的复杂性,让其满足开闭原则,提高代码的扩展性,利用更好的代码结构将一大坨代码拆分成职责更单一的小类,让其满足高内聚、低耦合等特性。不要为了用设计模式而用设计模式,导致过度设计,而应根据实际的场景选择合适的设计模式。其次,看《您的设计模式》中的代码实现会发现似乎各个设计模式的代码实现都有相似之处,如果不从使用场景的层面考虑,很难区分是哪种设计模式,实则无需过度的关注设计模式的代码实现,而应了解设计模式的使用场景,在特定的使用场景中,选择对应的设计模式,可以相互结合多种设计模式创造新的设计模式,将模式的思想融于其中。
《设计模式之美》中有些例子看一遍可能没法掌握,甚至学任何其他东西都有可能是学了后面忘了前面的状态,但不能因此就不去学一门技术了,学了不用会忘记是很正常的现象,但它会在大脑里留有一定的印象,当第二次看的时候就不会像第一次看的时候什么都不知道,一本书读一遍是不可能完全掌握的,每读一遍都会比前一遍多一些收获,多一些不同的感想。