《软件世界》杂志社
首页 > 期刊导读
 
/ / /
 

浅析软件设计模式

 
来源:软件世界 栏目:期刊导读 时间:2021-04-01
 
1 设计模式简介 设计模式针对面向对象的代码设计,进行经验总结,整理成一套在编程领域被反复运用、为大多人知晓的代码设计方法,并且进行分类。我们使用设计模式最主要的目的就是通过重用代码,提高软件项目开发效率。同时,使用设计模式开发的系统,其代码更具有可读性,容易被人理解,代码可靠。在我们开发项目时,根据项目需求,选择一个或多个适合的设计模式进行运用,可以极大促进系统的开发。 设计模式最早出现在建筑领域。很多人可能会有疑问,为什么软件领域的设计模式会和建筑学有关系呢?事实上,看似毫无关系的学科之间,都是有共性的。建筑大师Alexander 在1977 年出版的《A Pattern Language:Towns, Building, Construction》一书中,记录了200 多种解决建筑行业某些特定问题的最佳方案的模板,书中的思想在建筑业电照风行,很快就将这份影响传到了软件设计领域。1987 年,Ward Cunningham 和Kent Beck 受此启发,将模式语言应用到软件设计和开发中。1994 年“四人组(简称GoF)”归纳总结软件开发中经常使用到的23 种模式并发表,目的在于通过统一的模式,减少面向对象方法在某些方面的差异带来的问题。 2 设计模式的设计原则 对于一个设计模式,我们该如何去衡量它的效果呢?通常是用面向对象的设计原则来评价的。设计原则根据经验从无数个项目提取,在前人的基础上,试图为今后的软件开发提供更好的设计方法。每一个设计模式,总是符合一至多个设计原则。常用的有以下几个原则(没有严格的定论规定设计模式到底有几个原则,有的说6 大设计原则,有的说7 大设计原则,有的资料更是提到9 个设计原则。但不管是多少个设计原则,都是从“高内聚,低耦合”的目的出发,实现程序代码的高复用和可维护,所以多少个设计原则并不重要,重要的是要达到怎样的目标): 单一职责原则:顾名思义,就是每个类负责一个原则。就像流水线上的工人,有的负责检查产品,有的负责包装,有的负责贴码等。如果一个工人同时需要负责多个工作,就容易乱套,使工作陷入混乱中,所以需要对职责进行细分,类也是如此。作为最简单的设计原则,它保证类的粒度。 开闭原则:设计模式很重要的一点是可扩展性。作为一个好的设计模式,理应开放软件实体对功能的扩展,同时要保证不能随意对系统进行修改。因此,作为最重要的设计原则,开放原则使程序同时具备灵活性、适应性、延续性和稳定性。 里式替换原则:假设存在一个父类T1 和它的实例对象O1、子类T2 和实例对象O2,可以把对象O1 存在的地方都改为O2,并且程序的行为不发生改变,也就是子类能够替换父类,这就是里式替换。例如动物和它的子类,所有动物出现的地方,都可以用它的子类(猫、猴等)进行替换。里式替换可以帮助开闭原则得到更好的实现。 依赖倒转原则:面向接口编程,依赖于抽象类或者接口进行高低层模块的开发。例如我们在参加面试时,常常会去背某一个具体问题的答案。但面试官的问题千变万化,如果我们只是记住某几个具体问题的答案,是很容易被问倒的。原因在于对细节的依赖,所以我们应该转变策略,总结出一类问题的标准回答方式,如回答性格类的问题应该如何说。以抽象为基础的架构往往更加稳定灵活,因此设计模式应当重视依赖倒转原则的存在。 接口隔离原则:尽可能把一个庞大的接口拆分为小的、具体的接口。如果只有一个统一的大接口,所有方法都在该接口中被定义,其他类不得不实现这些方法,导致代码质量由于大量空方法的出现而急速下降。因此需要为每一个类建立专用接口,而非建立一个大接口供所有类调用。 合成复用原则:增加系统中组合和聚合关系的使用,减少继承的应用甚至不用。缺点是需要对系统中大量的对象进行管理,但它在一定程度上改善继承复用对系统封装性的破坏问题。 迪米特法则:减少软件实体对其他实体的引用,或者说如果两个类可以通过第三者进行间接交互,那么这两个类就尽量不要进行直接的相互作用。直白地说就是,不和陌生人说话,目的在于降低类的耦合。 3 设计模式之分类 通用的设计模式有23 种,这里不一一介绍。通过模式是用来做什么的(也就是目的),笔者把它分为创建型、结构型和行为型。 创建型模式与对象的实例化息息相关,以可控的方式创建对象。包含单例模式、建造者模式、工厂方法模式、抽象工厂模式和原型模式,以统一的方式抽象化实例过程,将创建和组合过程与对象剥离开,降低系统的耦合度。 创建型模式有两个基本点:①对于系统用到过的哪些类,进行封装操作;②将具体类的实例的创建和组合细节进行了隐藏。 创建型模式下的几个模式之间密切相关。例如,在有些场景中,两种模式可以互相代替,比如原型模式和抽象工厂模式;然而在另一些应用中,又可以将两者相结合,相互弥补,如使用建造者模式和工厂方法模式形成一个构件,实现更强大的功能。 结构型模式是通过组织各个类与对象,形成更为强大的组合,进而提供新的功能,重点在于组合方式。它涵盖适配器模式、外观模式、代理模式、桥接模式、装饰模式、组合模式以及享元模式7 种,都是通过将类和对象进行不同的组合来获得尽可能多的功能。我们对其进行进一步的细分,分为对象结构型模式(针对对象而言,采用组合、聚合方法)和类结构型模式(针对接口和类,运用继承机制)。 具体分析一下结构型中几个相似的模式。 适配器模式和桥接模式都是从向某个对象(除自身以外的接口)转发请求出发,为另一个对象提供一定的间接性。当一个类存在两个独立变化的维度,且都需要进行扩展时,就可以选择使用这两个模式,具有很强的灵活性。 组合模式和装饰模式的异同之处,可以通过结构图显而易见地看出来,相同点在于都是通过递归组织对象。但是装饰模式更加侧重在不修改现有对象或从其派生子类的前提下为其增添职责;组合模式的重点在于把子对象组成有层次性的整体(如树结构),在不改变方法调用的前提下,把它沿着子对象和组合对象的链往下传,直到作用到叶对象为止。 行为型模式通过识别对象之间的通信模式对其进行实现,描述了类或对象之间的交互方式和职责的分配。它是最庞大的家族,包括迭代器模式、观察者模式、责任链模式、命令模式、解释器模式、中介者模式、策略模式、备忘录模式、状态模式、模板方法模式和访问者模式这11 个,用继承机制分派类之间的行为。 行为模式的主题是对变化进行封装,它会使用一个对象封装某个特征的频繁改变,如中介者模式中的Mediator 对象和状态模式中的State 对象等。 除了以上的分类方法外,还能根据模式的作用对象,分成类模式和对象模式。结合两种不同的分类方式对单个模式进行细分,如单例模式是对象创建型模式。 4 总结与体会 从前面的分析来看,我们得知,设计模式在实际应用中有着很大的用途。 首先,作为通用的模板,它为开发人员提供沟通的便利,使设计的产品易于理解,为开发人员节省不少时间。当面对同一个设计模式时,编程语言的不同、项目类型的差异,甚至当一个开发团队的人来自不同国家时,对设计模式的理解都不会差很多。 其次,大部分的设计模式注重系统的扩展性和可重用性,这点对软件设计很重要。很多时候,一个软件系统不可能一次开发好所有的功能,需要不断进行完善;并且功能之间也是存在着重复的设计和代码,这就需要重用一些已设计好的设计方案和功能模块。同时随着软件规模的扩大,系统的可维护性也越来越重要。如果开发人员对于设计模式丝毫不懂,就难以做出一个成功的软件。 设计模式是众多专家的的智慧结晶,从许多优秀的软件系统中总结出来,可以有效提高设计和开发效率。在合理使用设计模式的基础上,对设计模式的使用情况进行文档化,可以帮助新人上手项目,快速理解项目的设计思路和实现方案。 每学习一个设计模式时,我们就要搞懂该设计模式的意图,它将解决的是一个什么样的问题,在什么情景下适合使用;它采用什么样的方法解决问题;体会设计模式再日常生活中的使用。 在学习过程中,我们可以感受到理解设计模式不是一件很难的事,但是当给出一个应用场景,让我们为其选择一个合适的应用场景时,我们可能无法快速地给出答案,这源于我们对设计模式的应用不够熟悉,一个真正厉害的软件开发师可以在一个特定场景下快速选择出适合的设计模式。如果我们想要真正掌握设计模式的精髓,就需要在实际开发中多使用设计模式。 [1] 黄宇栋.浅析设计模式在软件开发中的运用[J].金融科技时代,2008,16(12):40-41. [2] 贺亮.软件设计模式研究及应用[D].长沙:长沙理工大学,2009. [3] 郭荣.浅谈软件设计模式中的设计原则[J].信息安全与技术,2014(11):93-94. [4] 王微.大规模软件中23 种设计模式应用规律的研究与分析[D].沈阳:东北大学. 1 设计模式简介设计模式针对面向对象的代码设计,进行经验总结,整理成一套在编程领域被反复运用、为大多人知晓的代码设计方法,并且进行分类。我们使用设计模式最主要的目的就是通过重用代码,提高软件项目开发效率。同时,使用设计模式开发的系统,其代码更具有可读性,容易被人理解,代码可靠。在我们开发项目时,根据项目需求,选择一个或多个适合的设计模式进行运用,可以极大促进系统的开发。设计模式最早出现在建筑领域。很多人可能会有疑问,为什么软件领域的设计模式会和建筑学有关系呢?事实上,看似毫无关系的学科之间,都是有共性的。建筑大师Alexander 在1977 年出版的《A Pattern Language:Towns, Building, Construction》一书中,记录了200 多种解决建筑行业某些特定问题的最佳方案的模板,书中的思想在建筑业电照风行,很快就将这份影响传到了软件设计领域。1987 年,Ward Cunningham 和Kent Beck 受此启发,将模式语言应用到软件设计和开发中。1994 年“四人组(简称GoF)”归纳总结软件开发中经常使用到的23 种模式并发表,目的在于通过统一的模式,减少面向对象方法在某些方面的差异带来的问题。2 设计模式的设计原则对于一个设计模式,我们该如何去衡量它的效果呢?通常是用面向对象的设计原则来评价的。设计原则根据经验从无数个项目提取,在前人的基础上,试图为今后的软件开发提供更好的设计方法。每一个设计模式,总是符合一至多个设计原则。常用的有以下几个原则(没有严格的定论规定设计模式到底有几个原则,有的说6 大设计原则,有的说7 大设计原则,有的资料更是提到9 个设计原则。但不管是多少个设计原则,都是从“高内聚,低耦合”的目的出发,实现程序代码的高复用和可维护,所以多少个设计原则并不重要,重要的是要达到怎样的目标):单一职责原则:顾名思义,就是每个类负责一个原则。就像流水线上的工人,有的负责检查产品,有的负责包装,有的负责贴码等。如果一个工人同时需要负责多个工作,就容易乱套,使工作陷入混乱中,所以需要对职责进行细分,类也是如此。作为最简单的设计原则,它保证类的粒度。开闭原则:设计模式很重要的一点是可扩展性。作为一个好的设计模式,理应开放软件实体对功能的扩展,同时要保证不能随意对系统进行修改。因此,作为最重要的设计原则,开放原则使程序同时具备灵活性、适应性、延续性和稳定性。里式替换原则:假设存在一个父类T1 和它的实例对象O1、子类T2 和实例对象O2,可以把对象O1 存在的地方都改为O2,并且程序的行为不发生改变,也就是子类能够替换父类,这就是里式替换。例如动物和它的子类,所有动物出现的地方,都可以用它的子类(猫、猴等)进行替换。里式替换可以帮助开闭原则得到更好的实现。依赖倒转原则:面向接口编程,依赖于抽象类或者接口进行高低层模块的开发。例如我们在参加面试时,常常会去背某一个具体问题的答案。但面试官的问题千变万化,如果我们只是记住某几个具体问题的答案,是很容易被问倒的。原因在于对细节的依赖,所以我们应该转变策略,总结出一类问题的标准回答方式,如回答性格类的问题应该如何说。以抽象为基础的架构往往更加稳定灵活,因此设计模式应当重视依赖倒转原则的存在。接口隔离原则:尽可能把一个庞大的接口拆分为小的、具体的接口。如果只有一个统一的大接口,所有方法都在该接口中被定义,其他类不得不实现这些方法,导致代码质量由于大量空方法的出现而急速下降。因此需要为每一个类建立专用接口,而非建立一个大接口供所有类调用。合成复用原则:增加系统中组合和聚合关系的使用,减少继承的应用甚至不用。缺点是需要对系统中大量的对象进行管理,但它在一定程度上改善继承复用对系统封装性的破坏问题。迪米特法则:减少软件实体对其他实体的引用,或者说如果两个类可以通过第三者进行间接交互,那么这两个类就尽量不要进行直接的相互作用。直白地说就是,不和陌生人说话,目的在于降低类的耦合。3 设计模式之分类通用的设计模式有23 种,这里不一一介绍。通过模式是用来做什么的(也就是目的),笔者把它分为创建型、结构型和行为型。创建型模式与对象的实例化息息相关,以可控的方式创建对象。包含单例模式、建造者模式、工厂方法模式、抽象工厂模式和原型模式,以统一的方式抽象化实例过程,将创建和组合过程与对象剥离开,降低系统的耦合度。创建型模式有两个基本点:①对于系统用到过的哪些类,进行封装操作;②将具体类的实例的创建和组合细节进行了隐藏。创建型模式下的几个模式之间密切相关。例如,在有些场景中,两种模式可以互相代替,比如原型模式和抽象工厂模式;然而在另一些应用中,又可以将两者相结合,相互弥补,如使用建造者模式和工厂方法模式形成一个构件,实现更强大的功能。结构型模式是通过组织各个类与对象,形成更为强大的组合,进而提供新的功能,重点在于组合方式。它涵盖适配器模式、外观模式、代理模式、桥接模式、装饰模式、组合模式以及享元模式7 种,都是通过将类和对象进行不同的组合来获得尽可能多的功能。我们对其进行进一步的细分,分为对象结构型模式(针对对象而言,采用组合、聚合方法)和类结构型模式(针对接口和类,运用继承机制)。具体分析一下结构型中几个相似的模式。适配器模式和桥接模式都是从向某个对象(除自身以外的接口)转发请求出发,为另一个对象提供一定的间接性。当一个类存在两个独立变化的维度,且都需要进行扩展时,就可以选择使用这两个模式,具有很强的灵活性。组合模式和装饰模式的异同之处,可以通过结构图显而易见地看出来,相同点在于都是通过递归组织对象。但是装饰模式更加侧重在不修改现有对象或从其派生子类的前提下为其增添职责;组合模式的重点在于把子对象组成有层次性的整体(如树结构),在不改变方法调用的前提下,把它沿着子对象和组合对象的链往下传,直到作用到叶对象为止。行为型模式通过识别对象之间的通信模式对其进行实现,描述了类或对象之间的交互方式和职责的分配。它是最庞大的家族,包括迭代器模式、观察者模式、责任链模式、命令模式、解释器模式、中介者模式、策略模式、备忘录模式、状态模式、模板方法模式和访问者模式这11 个,用继承机制分派类之间的行为。行为模式的主题是对变化进行封装,它会使用一个对象封装某个特征的频繁改变,如中介者模式中的Mediator 对象和状态模式中的State 对象等。除了以上的分类方法外,还能根据模式的作用对象,分成类模式和对象模式。结合两种不同的分类方式对单个模式进行细分,如单例模式是对象创建型模式。4 总结与体会从前面的分析来看,我们得知,设计模式在实际应用中有着很大的用途。首先,作为通用的模板,它为开发人员提供沟通的便利,使设计的产品易于理解,为开发人员节省不少时间。当面对同一个设计模式时,编程语言的不同、项目类型的差异,甚至当一个开发团队的人来自不同国家时,对设计模式的理解都不会差很多。其次,大部分的设计模式注重系统的扩展性和可重用性,这点对软件设计很重要。很多时候,一个软件系统不可能一次开发好所有的功能,需要不断进行完善;并且功能之间也是存在着重复的设计和代码,这就需要重用一些已设计好的设计方案和功能模块。同时随着软件规模的扩大,系统的可维护性也越来越重要。如果开发人员对于设计模式丝毫不懂,就难以做出一个成功的软件。设计模式是众多专家的的智慧结晶,从许多优秀的软件系统中总结出来,可以有效提高设计和开发效率。在合理使用设计模式的基础上,对设计模式的使用情况进行文档化,可以帮助新人上手项目,快速理解项目的设计思路和实现方案。每学习一个设计模式时,我们就要搞懂该设计模式的意图,它将解决的是一个什么样的问题,在什么情景下适合使用;它采用什么样的方法解决问题;体会设计模式再日常生活中的使用。在学习过程中,我们可以感受到理解设计模式不是一件很难的事,但是当给出一个应用场景,让我们为其选择一个合适的应用场景时,我们可能无法快速地给出答案,这源于我们对设计模式的应用不够熟悉,一个真正厉害的软件开发师可以在一个特定场景下快速选择出适合的设计模式。如果我们想要真正掌握设计模式的精髓,就需要在实际开发中多使用设计模式。参考文献[1] 黄宇栋.浅析设计模式在软件开发中的运用[J].金融科技时代,2008,16(12):40-41.[2] 贺亮.软件设计模式研究及应用[D].长沙:长沙理工大学,2009.[3] 郭荣.浅谈软件设计模式中的设计原则[J].信息安全与技术,2014(11):93-94.[4] 王微.大规模软件中23 种设计模式应用规律的研究与分析[D].沈阳:东北大学.

文章来源:软件世界 网址: http://rjsj.400nongye.com/lunwen/itemid-13775.shtml


上一篇: 浅谈如何借助软件对地理图片进行优化处理
下一篇: 互联网技术论文_基于元数据和指令流的64位Windows堆栈取证



点击在线投稿

 
/ / /
 
 
 
 

Copyright 2001-2021 400农业期刊网版权所有 做最专业学术期刊论文发表网站
本站不是《软件世界杂志社》官网,如果需要联系官方杂志社,请联系客服索取网站或者电话。