目录
一、设计模式学前导读
1、代码质量好坏如何评价 ?
2、编程方法论
二、设计模式概述
设计模式的产生
UML图
三、六大设计原则
1、单一职责原则(Single Responsibitity Principle)
2、开放封闭原则(Open Close Principle)
3、里氏替换原则(Liskov Substitution Principle)
4、接口分离原则(Interface Segregation Principle)
5、依赖倒置原则(Dependence Inversion Principle)
6、迪米特法则(Least Knowledge Principle)
一、设计模式学前导读
1、代码质量好坏如何评价 ?
1)可维护性
可维护性强的代码指的是: 在不去破坏原有的代码设计以及不引入新的BUG的前提下,能够快速的修改或者新增代码.
不易维护的代码指的是: 在添加或者修改一些功能逻辑的时候,存在极大的引入新的BUG的风险,并且需要花费的时间也很长.
2)可读性
软件开发教父,Martin Fowler曾经说过一句话: "任何傻瓜都能够编写计算机能理解的代码,而优秀的程序员能够编写人类能理解的代码。"
3)可扩展性
代码的可扩展性表示,我们在不修改或少量修改原有代码的情况下,通过扩展的方式添加新的功能代码。
4)灵活性
"灵活" 是指在添加新代码的时候,已有代码能够不受影响,不产生冲突,不出现排斥,在保证自身不遭到破坏的前提下灵活地接纳新代码。
5)简洁性
代码的写法应当使别人理解它所需的时间最小化.
6)可复用性
代码的可复用性可以简单地理解为,尽量减少重复代码的编写,复用已有的代码.
7)可测试性
单元测试在一个完整的软件开发流程中是必不可少的、非常重要的一个环节。通常写单元测试并不难,但有的时候,有的代码和功能难以测试,导致写起测试来困难重重。所以写出的代码具有可测试性,具有很重要的作用。
2、编程方法论
想要拥有编写高质量代码的能力,我们就要学习一些编程的方法论.其中就包含面向对象(我们可以把它看成一种设计思想)、设计原则、设计模式、编程规范、重构技巧等
1)面向对象
面向对象是一种编程思想,也是一种编程范式. 现在比较流行的编程语言大部分都是面向对象编程语言.而大部分项目也都是基于面向对象编程风格进行开发的.
2)设计原则
设计原则是指导我们代码设计的一些经验总结。在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据设计原则来开发程序,从而提高软件开发效率、节约软件开发成本和维护成本。
3)设计模式
设计模式是针对软件开发中经常遇到的一些设计问题,总结出来的一套解决方案或者设计思 路。大部分设计模式要解决的都是代码的可扩展性问题。
4)编程规范
编程规范主要解决的是代码的可读性问题。编码规范相对于设计原则、设计模式,更加具 体、更加偏重代码细节。
5)重构
维基百科: 在软件工程学里,重构代码一词通常是指在不改变代码的外部行为情况下而修改源代码,有时非正式地称为“清理干净”。在极限编程或其他敏捷方法学中,重构常常是软件开发循环的一部分:开发者轮流增加新的测试和功能,并重构代码来增进内部的清晰性和一致性。
二、设计模式概述
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结.
世上本没有路,走的人多了,便变成了路。在程序员的世界中,本没有设计模式,写代码是人多了,他们便总结出了一套能提高开发和维护效率的套路,这就是设计模式。
设计模式的产生
"设计模式" 最初并不是出现在软件设计中,而是被用于建筑领域的设计中。
1977年美国著名建筑大师、加利福尼亚大学伯克利分校环境结构中心主任克里斯托夫·亚历山大(Christopher Alexander)在他的著作《建筑模式语言:城镇、建筑、构造》中描述了一些常见的建筑设计问题,并提出了 253 种关于对城镇、邻里、住宅、花园和房间等进行设计的基本模式。
四人帮(GOF)
1990年软件工程界开始研讨设计模式的话题,后来召开了多次关于设计模式的研讨会。 1994 年,艾瑞克·伽马(ErichGamma)、理査德·海尔姆(Richard Helm)、拉尔夫·约翰森(Ralph Johnson)、约翰·威利斯迪斯(John Vlissides)等 4 位作者合作出版了《设计模式:可复用面向对象软件的基础》一书,在此书中收录了 23 个设计模式,这是设计模式领域里程碑的事件,导致了软件设计模式的突破。 备注:由于书名太长, 人们将其简称为 "四人组 (Gang of Four, GoF) 的书", 并且很快进一步简化为 "GoF 的书"。
设计模式的分类
GoF设计模式有23个,它们各具特色,每个模式都为某一个可重复的设计问题提供了一套解决方案。根据它们的用途,设计模式可分为:
创建型模式(5种):提供创建对象的机制,提升已有代码的灵活性和可复用性
常用:单例模式、工厂模式(工厂方法和抽象工厂)、建造者模式.
不常用:原型模式
结构型模式(7种):介绍如何将对象和类组装成较大的结构,并同时保持结构的灵活和高效
常用:代理模式、桥接模式、装饰者模式、适配器模式。
不常用:外观模式、组合模式、享元模式。
行为模式(11种):负责对象间的高效沟通和职责传递委派
常用:观察者模式、模板模式、策略模式、责任链模式、迭代器模式、状态模式。
不常用:访问者模式、备忘录模式、命令模式、解释器模式、中介模式。
UML图
统一建模语言(Unified Modeling Language,UML)是用来设计软件的可视化建模语言。它的特点是简单、统一、图形化、能表达软件设计中的动态与静态信息。
UML的分类:
静态结构图: 类图、对象图、组件图、部署图
动态行为图: 状态图、活动图、时序图、协作图、构件图等。
类图反映的是类结构和类之间关系为目的,用以描述软件系统的结构,是一种静态建模方法。
在类的UML图中,使用长方形描述一个类的主要构成,长方形垂直地分为三层,以此放置类的名称、属性和方法。
“+” 表示 public; “-” 表示 private; “#” 表示 protected; 不带符号表示 default。
抽象类在UML类图中同样用矩形框表示,但是抽象类的类名以及抽象方法的名字都用斜体字表示
接口在类图中也是用矩形框表示,但是与类的表示法不同的是,接口在类图中的第一层顶端用构造型 <<interface>>表示,下面是接口的名字,第二层是方法。
UML类图中表示关系
类和类、类和接口、接口和接口之间存在一定关系,UML类图中一般会有连线指明它们之间的关系。
泛化关系:也就是继承关系。
多用组合少用继承!
三、六大设计原则
设计模式中主要有六大设计原则,简称为SOLID,是由于各个原则的首字母简称合并的来(两个L算一个,solid 稳定的),六大设计原则分别如下:
1、单一职责原则(Single Responsibitity Principle)
官方定义:
单一职责原则,英文缩写SRP,全称 Single Responsibility Principle。
在<<架构整洁之道>>一书中 关于这个原则的描述是这样的:一个类或者模块只负责完成一个职责(或者功能)。
通俗解释:
单一职责原则的定义描述非常简单,也不难理解。一个类只负责完成一个职责或者功能。也就是说在类的设计中 我们不要设计大而全的类,而是要设计粒度小、功能单一的类.
如何判断一个类的职责是否单一?
1、类中的代码行数、函数或者属性过多
2、类依赖的其他类过多
3、私有方法过多
4、类中的大量的方法总是操作类中的几个属性
2、开放封闭原则(Open Close Principle)
官方定义:
一般认为最早提出开闭原则(Open-Close Principle,OCP)的是伯特兰·迈耶。他在1988 年发表的《面向对象软件构造》中给出的。
在面向对象编程领域中,开闭原则规定软件中的对象、类、模块和函数对扩展应该是开放的,但对于修改是封闭的。这意味着应该用抽象定义结构,用具体实现扩展细节,以此确保软件系统开发和维护过程的可靠性。
通俗解释:
定义:对扩展开放,对修改关闭
优点:
1. 新老逻辑解耦,需求发生改变不会影响老业务的逻辑
2. 改动成本最小,只需要追加新逻辑,不需要改的老逻辑
3. 提供代码的稳定性和可扩展性
顶层设计思维:
1、抽象意识
2、封装意识
3、扩展意识
3、里氏替换原则(Liskov Substitution Principle)
官方定义:
里氏替换原则(Liskov Substitution Principle,LSP)是由麻省理工学院计算机科学系教授芭芭拉·利斯科夫于 1987年在“面向对象技术的高峰会议”(OOPSLA)上发表的一篇论文《数据抽象和层次》(Data Abstractionand Hierarchy)里提出的.
她在论文中提到:如果S是T的子类型,对于S类型的任意对象,如果将他们看作是T类型的对象,则对象的行为也理应与期望的行为一致。
通俗解释:
要理解里氏替换原则,其实就是要理解两个问题:
1.什么是替换?
替换的前提是面向对象语言所支持的多态特性,同一个行为具有多个不同表现形式或形态的能力。
简单说就是当我的一个方法的参数是一个接口类型时,这个方法可以接收所有实现过这个接口的实现类
2.什么是与期望行为一致的替换?
在不了解派生类的情况下,仅通过接口或基类的方法,即可清楚的知道方法的行为,而不管哪种派生类的实现,都与接口或基类方法的期望行为一致。
4、接口分离原则(Interface Segregation Principle)
官方定义:
<<代码整洁之道>>作者罗伯特 C·马丁 为 “接口隔离原则” 的定义是:客户端不应该被迫依赖于它不使用的方法(Clients should not be forced to depend on methods they do not use)。
该原则还有另外一个定义:一个类对另一个类的依赖应该建立在最小的接口上
通俗解释:
上面两个定义的含义用一句话概括就是:要为各个类建立它们需要的专用接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用。
遵循接口隔离原则的优势:
1、将胖接口分解成多个粒度小的接口,可以提高系统的灵活性和可维护性
2、使用多个专门的接口,还能够体现出对象的层次
3、能够减少项目工程中的冗余代码
5、依赖倒置原则(Dependence Inversion Principle)
官方定义:
依赖倒置原则是罗伯特 C·马丁于1996年在C++Report上发表的文章中提出的。
依赖倒置原则(Dependence Inversion Principle,DIP)是指在设计代码架构时,高层模块不应该依赖于底层模块,二者都应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。
通俗解释:
依赖倒置原则想要表达的是: 由于在软件设计中,细节具有多变性,而抽象层则相对稳定,因此以抽象为基础搭建起来的架构要比以细节为基础搭建起来的架构要稳定得多。
6、迪米特法则(Least Knowledge Principle)
官方定义:
1987年秋天,迪米特法则由美国Northeastern University的Ian Holland(伊恩 霍兰德)提出,被UML的创始者之一Booch(布奇)等人普及。后来,因为经典著作The PragmaticProgrammer <<程序员修炼之道>>而广为人知。
迪米特法则又叫最少知识原则(LKP:Least Knowledge Principle ),指的是一个类/模块对其他的类/模块有越少的了解越好。
通俗解释:
简单来说迪米特法则想要表达的思想就是: 不该有直接依赖关系的类之间,不要有依赖;有依赖关系的类之间,尽量只依赖必要的接口。
Java 设计模式
无论你是年轻还是年长,所有程序员都需要记住:时刻努力学习新技术,否则就会被时代抛弃!
一个程序员最重要的能力是:写出高质量的代码!!
有道无术,术尚可求也,有术无道,止于术。