Section1.前言今天我们来聊聊设计模式。我们在学习Java的时候经常会听到单例模式、多例模式,而在使用Spring的时候,默认采用的单例模式,你听到的“满人式”“饿汉式”都是对设计模式的描述。那么什么是设计模式呢?是什么概念。第II部分,设计模式概念和GOF设计模式设计模式代表最佳实践,通常被经验丰富的面向对象软件开发人员采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员在相当长的一段时间内反复试验的结果。个人理解:设计模式不是一门技术,而是在项目迭代过程中,为了实现一些功能,设计一些解决方案,总结这些经验而设计的模式体系。这套系统是反复使用,大部分人都知道的代码设计经验总结,编目,编码。为什么要使用设计模式?设计模式用于重用代码,使代码更容易被他人理解,并保证代码的可靠性。在目前的软件设计趋势中,设计模式已经应用到各个公司的各个项目中。设计模式让代码编写过程真正工程化。设计模式是软件工程的基石,就像建筑的砖头一样。在项目中合理的使用设计模式可以完美的解决很多问题。每一种模式都有对应的原则来对应现实中的它。每一种模式都描述了一个相似且反复出现的问题,并提供了问题的核心解决方案,这也是设计模式能够得到广泛应用的原因。GOF设计模式有些朋友可能听说过“GOF设计模式”。不要认为GOF是个人,更不要认为这些图案是他创造的。GOF是一个四人小团队。他们的全名是“四人帮”。GOF设计模式是在1994年,这个团队的四个人将软件开发中经常使用的设计模式进行总结,写成DesignPatterns。:ElementsofReusableObject-OrientedSoftware[《设计模式:可复用面向对象软件的 基础》],本书的出版也标志着设计模式正式成为面向对象(ObjectOriented)软件工程的一个重要研究分支。第三节,设计模式六大原则及分类在讲解GOF设计模式之前,我们先了解一下设计模式六大原则:闭包。当程序需要扩展时可以使用,但不能修改原有代码实现扩展。里氏替换原则(LiskovSubstitutionPrinciple)凡是基类可以出现的地方,都必须出现子类。只有派生类能够替代基类,软件单元的功能不受影响时,基类才能真正被重用,派生类也可以在基类的基础上增加新的行为。Liskov替换原则是对开闭原则的补充。实现开闭原则的关键步骤是抽象,而基类和子类的继承关系就是抽象的具体实现。可以理解为:子类可以扩展父类的功能,但不能改变原有父类的功能,例如:子类可以替换父类在代码中出现过的地方,而代码更换代码后仍可正常工作。依赖倒置原则(DependenceInversionPrinciple)是针对接口编程,依赖抽象而非具体。一个简单的解释就是面向接口编程。“抽象”是接口或抽象类,“具体”是实现类;意思是:上层模块不应该依赖下层模块,两者都应该依赖于它的抽象;抽象不应该依赖于细节,细节应该依赖于抽象;传递变量或参数,尽量使用抽象类,或接口。例如:接口负责定义公共构造方法,抽象类负责公共构造部分的实现,实现类准确实现业务逻辑。接口隔离原则(InterfaceSegregationPrinciple)使用多个隔离的接口进行开发,比使用单一接口要好。目的是减少类之间的耦合。DemeterPrinciple)是最不为人知的原则,应该尽可能降低类之间的耦合。一个实体应尽可能少地与其他实体进行交互,使系统功能模块相对独立,防止高耦合。复合复用原则(CompositeReusePrinciple)要求在软件复用时,尽可能使用组合或聚合等关联关系来实现,再考虑使用继承关系来实现。如果要使用继承关系,必须严格遵循里氏代换原则。复合复用原则和里氏代换原则相辅相成,都是开闭原则的具体实现规范。复合复用的原理是通过将现有对象合并到新对象中作为新对象的成员对象来实现的。新对象可以调用已有对象的函数,实现复用。程序设计目标:高内聚、低耦合根据目的,设计模式可分为以下三种类型:创建型模式:用来描述“如何创建对象”。结构模式:用来描述如何将类或对象以一定的布局组织成更大的结构。行为模式:用来描述类或对象如何相互协作,完成单个对象单独无法完成的任务,以及如何分配职责。设计模式按作用范围可分为两大类:类模式:用于处理类与子类之间的关系,这些关系是通过继承建立的,是静态的,在编译时确定。对象模式:用于处理对象之间的关系。这些关系可以通过组合或聚合来实现,可以在运行时改变,更加动态。Scope\PurposeCreationStructuralBehavior类模式1.工厂模式1.(类)适配器模式1.模板模式2.解释器模式对象模式2.单例模式3.原型模式4.抽象工厂模式5.构造1.(对象)适配器模式2.代理模式3.桥接模式4.装饰器模式5.外观模式6.享元模式7.组合模式3.策略模式4.命令模式5.责任链模式6.状态模式7.观察者模式8.中介模式9.迭代器模式10.访问者模式11.备忘录模式第四节、学习和理解类图了解UML类图可以更好的学习设计模式,主流设计模式可以通过UML类图更加清晰明了的展示类之间的关系;学习UML类图还可以更快地理解类之间的关系。什么是UML?1)UML,全称统一建模语言UML(UnifiedModelingLanguage),是一种软件系统分析和设计的语言工具。它用于帮助软件开发人员思考并记录他们思考的结果。2)UML类似于流程图,有一组符号,就像数学符号和化学符号一样,用来描述软件模型中的各个元素以及它们之间的关系,如类、接口、实现、generalizations常见的集中式UML图,如,dependency,combination,aggregation等你可能见过下面的UML图:用例图类图序列图UML图可以简单的分为三类:用例图(usecase)。静态结构图:类图、对象图、包图、组件图、部署图。动态行为图:交互图(顺序图和协作图)、状态图和活动图。我们主要研究类图。那种图是什么?.类图可以组织在(并且属于)包中,仅显示特定包中的相关内容。类图(Classdiagram)也是最常用的UML图,展示了类、接口,以及它们之间的静态结构和关系;用于描述系统的结构设计,类图(Classdiagram)最基本的元素是类或接口。类图类图类(Class)的主要模型元素。界面。类之间的关系。1、类(Class)是指对具有相同属性、方法和关系的对象的抽象。它封装了数据和行为,是面向对象编程(OOP)的基础。它具有封装性、继承性和多态性等三大特性。在UML中,一个类由一个包含类名、属性和带有分隔线的操作的矩形表示。(1)班级名称(Name):为字符串,例如Student。(2)属性(Attribute):指类的特性,即类的成员变量。UML用以下格式表示:[Visibility]属性名称:类型[=默认值]例如:-name:String注:“Visibility”表示该属性是否对类外的元素可见,包括公共(Public),private(私有)、protected(保护)和friend(Friendly,Java类图中不适用该类型,其他语言可用),在类图中用符号+、-、#、~表示(3)Operations):是类的任何实例对象都可以使用的行为,是类的成员方法。UML的表达格式如下:[visibility]name(parameterlist)[:returntype]例如:+display():void下图为学生类的UML表示:2.Interface接口(Interface)是一个特殊的类,具有类结构,但不能实例化,只能通过实现类来实现。它包含抽象操作(抽象方法),但不包含属性(成员变量),它描述了类或组件的外部可见动作。在UML中,接口由一个带有一条线的小圆圈表示。如下图,左上角带横线和小圆圈的类名就是接口。3.类之间的关系类之间的关系有6种:依赖关系、关联关系、聚合关系、组合关系、泛化关系和实现关系。每个关系之间的形状配置如下:关系形状依赖(Dependency)带箭头的虚线,指向关联(Association)带普通箭头的实线,指向所有者,双向关联可以有两个箭头或没有箭头,单向关联有一个箭头,箭头指向关联的By。聚合(Aggregation)带空心菱形的实线,菱形指向整体组合(Composition)带实心菱形的实线,菱形指向泛化(Generalization)带三角箭头的实线,箭头指向父级类实现(Realization)带有三角箭头的虚线,箭头指向接口1.依赖依赖(Dependency)关系是一种使用关系,是对象之间最弱的耦合。比如在Java中,一个类的方法通过局部变量、方法参数或者调用静态方法来访问另一个类(依赖类)中的一些方法,完成一些业务开发。依赖关系由带箭头的虚线表示。箭头从使用类指向依赖类(用户),如下图,说明了人和车的关系。人们通过汽车的运行方式完成驾驶。2.关联关系关联(Association)关系是对象之间的引用关系,用来表示一类对象与另一类对象之间的联系;关联可以是双向的或单向的。在UML类图中,双向关联可以用带两个箭头或没有箭头的实线表示,单向关联可以用带一个箭头的实线表示,其中一个箭头从使用类指向关联类。也可以在关联线的两端标注角色名称,代表两个不同的角色。(1)单向关联,拥有汽车的人的属性对象。(2)双向关联,一个人拥有一辆车,这辆车拥有属于它的人的信息属性(3)自关联,水是由无数的水分子组成的,但水分子仍然是水3.聚合关系聚合关系是关联关系的一部分一种是强关联关系,整体与部分的关系,has-a关系;如果把整体和部分分开拿出来,也可以成为独立的模块,但是整体需要靠部分来保证整体。在UML类图中,聚合关系可以用带空心菱形的实线表示,指向整体。比如下图:公司和员工各自是一个独立的关系。公司消失了,员工还是员工,但如果所有员工都消失了,公司也就不复存在了。4、组合关系组合关系也是关联关系的一种,也代表类与类之间的整体与部分的关系,但它是一种更强的聚合关系,是一种cxmtains-a关系;在组合关系中,整体对象可以控制部分对象的生命周期。整体客体不存在,部分客体将不存在,部分客体离开整体客体就无法存在;在UML类图中,组成关系用实心菱形实线表示,菱形指向整体。例如下图:脚是人体的重要组成部分。如果身体不存在,那么脚也就不存在,部分与整体是分不开的。5.泛化关系泛化关系是对象之间最耦合的关系,父类和子类的关系,继承关系,is-a关系。用Java的概念,可以认为只要是父类被子类继承,父类与子类之间的关系就称为“泛化关系”。在UML类图中,泛化关系由带有从子类指向父类的空心三角形箭头的实线表示。在实现代码时,使用面向对象的继承机制实现泛化关系。例如下图中:人作为父类,可能有多个子类,作者具有人的属性,有自己特殊的“写作”技能,读者有“评书”的技能,这就构成了泛化关系(humans而作者、人类和读者是泛化关系)。6.实现关系实现(Realization)关系就是接口和实现类之间的关系。在这种关系中,实现类实现了接口中的抽象方法,类中的操作实现了接口中声明的所有抽象操作。在UML类图中,实现关系由带有从实现类指向接口的空心三角形箭头的虚线表示。比如下图:汽车就是一个接口,一个规范,能跑起来就够了。汽车和自行车都实现了“run”方法,现在汽车可以实现自动驾驶,就是按照接口规范实现“run”。方法,那么接口和实现类之间的关系就是实现关系。Section5,ConclusionGOF中的23种常见设计模式总结了目前主流的设计模式,其中简单工厂模式实现起来比较容易,所以没有收录;在接下来的一段时间里,小编将带领大家学习24种设计模式,讲述每一种设计模式的概念,绘制类图,以及应用场景,让大家一起学习成长。本文转载自微信公众号《IT小白架构师之路》,可通过以下二维码关注。转载本文请联系IT小白架构师路公众号。
