资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,.,*,软件设计模式,Software Design Pattern,1,.,第一讲 软件设计模式概述,设计模式的基本概念,软件危机,软件设计模式的定义,软件设计模式的必要性与作用,软件设计的基本原则,软件设计模式学习的前提基础,软件设计模式的主要分类,创建型模式,结构型模式,行为型模式,工厂方法模式,2,.,设计模式的基本概念,-,软件危机,软件危机的含义,软件危机是指在计算机软件的开发和维护过程中所遇到的一系列严重问题。这些问题不仅仅是不能正常运行的软件才具有的,实际上,几乎所有软件都不同程度的存在这些问题。软件危机包含下属两方面的问题:如何开发软件,以满足对软件日益增长的需求;如何维护数量不断膨胀的已有软件。,3,.,设计模式的基本概念,-,软件危机,软件危机的产生原因,与软件本身的特点有关,。软件不同于硬件,它是计算机系统中的逻辑部件而不是物理部件;软件不会因使用时间过长而“老化”或“用坏”;在写出程序代码并在计算机上试运行之前,软件开发过程的进展情况较难衡量,软件质量也较难评价,因此管理和控制软件开发过程十分困难;,软件质量不是根据大量制造的相同实体的质量来度量,而是与每一个组成部分的不同实体的质量紧密相关,,因此,在运行时所出现的软件错误几乎都是在开发时期就存在而一直未被发现的,改正这类错误通常意味着改正或修改原来的设计,这就在客观上使得软件维护远比硬件维护困难;软件是一种信息产品,具有可延展性,属于柔性生产,与通用性强的硬件相比,软件更具有多样化的特点。,4,.,设计模式的基本概念,-,软件危机,软件危机的产生原因,来自于软件开发人员的弱点,。其一,软件产品是人的思维结果,因此软件生产水平最终在相当程度上取决于软件人员的教育、训练和经验的积累;其二,对于大型软件往往需要许多人合作开发,甚至要求软件开发人员深入应用领域的问题研究,这样就需要在用户与软件人员之间以及软件开发人员之间相互通讯,在此过程中难免发生理解的差异,从而导致后续错误的设计或实现,而要消除这些误解和错误往往需要付出巨大的代价;其三,由于计算机技术和应用发展迅速,知识更新周期加快,软件开发人员经常处在变化之中,不仅需要适应硬件更新的变化,而且还要涉及日益扩大的应用领域问题研究。,5,.,设计模式的基本概念,-,软件危机,软件危机,软件危机主要有以下一些典型表现:,1.,对软件开发成本和进度的估计常常很不准确。,2.,用户对“已完成的”软件系统不满意的现象经常发生。,3.,软件产品的质量往往靠不住。,4.,软件常常是不可维护的。,5.,软件通常没有适当的文档资料。,6.,软件成本在计算机系统总成本中所占的比例逐年上升。,7.,软件开发生产率提高的速度,远远跟不上计算机应用迅速普及深入的趋势。,6,.,设计模式的基本概念,模式,设计模式,软件设计模式的必要性与作用,设计模式的分类,7,.,设计模式的基本概念,设计模式的概念最早起源于,Christopher Alexander.,每个模式描述了一个在我们的环境中不断出现的问题以及该问题解决方案的核心。,通过使用模式,我们可以无限次使用那些已有的解决方案,无需重复相同的工作。,通用定义:,模式是一种问题的解决思路,它已经适用于一种实践环境,并可以使用于其他环境。,8,.,设计模式的基本概念,-,生活中的模式,古人在遇到生活问题时,能通过不断的思考、实践、总结,最后得到许多解决生活困难的方法。,后人遇到相同问题的时候,也会采用同样的方法,这些方法就被称为模式。,烤肉,-,取火,取水,-,打井,耕田,-,耕牛,9,.,设计模式的基本概念,-,设计模式,所谓设计模式是对于某一类软件设计问题的可重用的解决方案。,设计模式的最终目标就是帮助人们利用成功软件设计师们的集体经验,来设计出更加优秀的软件,解决软件危机的问题。,引入软件设计模式将成为企业或者个人可持续发展的必然选择。只有专业,才能在这个领域做得最好,为社会、企业和个人带来更多的价值,10,.,设计模式的基本概念,-,设计模式的特点,设计模式的特点,名称,每个设计模式都有一个名称。,可传授性,问题反复出现,解决问题的方案相同,大家都接受改方案。,可重用性,问题反复出现,尽管问题出现的 环境有不同,但解决方案都应该有效。,11,.,设计模式的基本概念,-,设计模式的必要性与作用,重用设计,重用设计比重用代码更有意义,它会自动带来代码重 用;,为设计提供共同的词汇,每个模式名就是一个设计词汇,其概念使得程序员间的交流更加 方便;编写开发文档更加容易;,重构系统更加容易,设计模式从最初的设计就考虑到变化,因此当需求发生变化时,一般不会改变整体设计;,节约设计时间,可采用任何编程语言实现,12,.,设计模式的基本概念,-,设计模式基本原则,高内聚、低耦合,一个软件系统要有一个稳定的架构,不会随需求的改变而发生巨大的变动。因此,高内聚、低耦合是一个软件系统设计中必须遵循的基本原则。,面向抽象编程,在面向过程的软件开发中,上层组件调用下层组件,就意味着上层组件依赖于下层组件,当下层组件发生剧烈变化时,上层组件也要跟着一起发生变动,这将导致软件组件模块的复用性大大降低,从而增加软件开发成本,使软件结构设计上存在一定的臃肿性,不利于后期系统维护工作。,多用组合少用继承,在面向对象的软件设计中,对于类的扩展,首先想到的是使用类的继承来实现,由子类继承父类,从而完成对子类功能的扩展。继承的好处是可以尽量让相同的属性或者功能复用,但是随着项目越来越大,需求的不断变化,继承就会变得越来越臃肿,后期难以控制和维护。最重要的是,继承会不分青红皂白地把父类的公有和受保护的方法统统继承下来,而这些方法可能是子类不需要的功能,会对子类产生一些危害。,“开,-,闭”原则,即“对扩展开放,对修改关闭”,13,.,设计模式的基本概念,-,设计模式的分类,目前设计模式可以分为两大类:,GOF(Gang of Four),GOF,是由四位,(Erich GAMMA,Richarc Helm,Ralph Johnson,John Vlissides),具有丰富的面向对象设计经验的大师给出的,所以被称为“四人帮”模式;,GOF,设计模式常用的有,23,种;,着重考虑设计的实现,类的交互和软件的质量;,GRASP(General Responsibility Assignment Software Patterns),通用责任分配挼建设计模式;,着重考虑设计类的原则以及如何分配类的功能;,GOF,是遵循,GRASP,模式要求的面向对象设计模式,14,.,设计模式的基本概念,-,设计模式的分类,GOF,设计模式分类可基于两种准则:,根据模式的目的,也就是根据模式是用来完成什么工作,Creational(,创建型,),Structural(,结构型,),Behavioral(,行为型),根据模式的范围,模式是针对类还是对象,类模式;,对象模式;,15,.,设计模式的基本概念,-,设计模式的分类,16,.,设计模式学习的前提基础,至少掌握一种面向对象程序设计语言,具有面向对象程序设计的基本概念,掌握,UML,(,Unified Modelling Language),实践是需要理论知识积累的。要想正确应用各种设计模式,首先需要学习设计模式,掌握设计模式的实现要点,最重要的是在学习设计模式当中掌握软件设计原则。设计模式是前人的实践经验总结出来的,具有固定的实现方式,但是设计原则是活的,是需要我们认真体会和领悟的。,17,.,创建型模式之一(工厂方法模式),名称:工厂方法模式(,Factory method pattern),或工厂模式(,Factory pattern),或 虚构造器(,Virtual Constructor),设计:父类负责定义创建对象的公共接口,子类则负责生成具体的对象。,意图:将类的实例化操作延迟到子类中完成,由子类来决定究竟该实例化(创建)哪一个类。,18,.,创建型模式之一(工厂方法模式),所谓工厂方法模式(,Factory Method Pattern,),就是定义一个创建产品对象的工厂接口,让子类决定实例化哪一种实例对象,也就是将实际创建实例对象的工作推迟到子类当中,核心工厂类不再负责具体产品的创建。,19,.,创建型模式之一(工厂方法模式),20,.,创建型模式之一(工厂方法模式),21,.,创建型模式之一(工厂方法模式),工厂方法时序图,22,.,创建型模式之一(工厂方法模式),实例一(兵工厂),23,.,创建型模式之一(工厂方法模式),实例一(兵工厂),24,.,创建型模式之一(工厂方法模式),实例二(多文档),25,.,接口的作用,接口的定义方面来说,接口其实就是类和类之间的一种协定,一种约束(安全性),.,方便统一管理,.,另一个是方便调用,提高模块内的内聚性,降低模块间的耦合性,.,扩展性,使用方便,可读性强,结构清晰的特点。,interface IBark,void Bark();,class Dog,implement IBark public Dog()public void Bark()System.out.println(,汪汪,);,26,.,抽象类和接口的区别,abstract class,在,Java,语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个,interface。,abstract class,中可以有自己的数据成员,也可以有非,abstarct,的成员方法,而在,interface,中,只能够有静态的不能被修改的数据成员(也就是必须是,static final,的,不过在,interface,中一般不定义数据成员),所有的成员方法都是,abstract,的。,abstract class,和,interface,所反映出的设计理念不同。其实,abstract class,表示的是,is-a,关系,,interface,表示的是,like-a,关系。,实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现方法。,接口中定义的变量默认是,public static final,型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。,抽象类中的变量默认是,friendly,型,其值可以在子类中重新定义,也可以重新赋值。,接口中的方法默认都是,public,abstract,类型的。,27,.,创建型模式之一(工厂方法模式),实例二(多文档),28,.,创建型模式之一(工厂方法模式),实例二(多文档),29,.,创建型模式之一(工厂方法模式),实例二(多文档),30,.,创建型模式之一(工厂方法模式),实例二(多文档),31,.,创建型模式之一(工厂方法模式),实例二(多文档),32,.,创建型模式之一(工厂方法模式),实例三(手机工厂),33,.,创建型模式之一(工厂方法模式),实例三(手机工厂),34,.,创建型模式之一(工厂方法模式),实例三(手机工厂),35,.,创建型模式之一(工厂方法模式),实例三(手机工厂),36,.,创建型模式之一(工厂方法模式,故事中的工厂方法模式,我们看一下故事中出现的人物和事物各自对应工厂方法设计模式的哪些部件,如下所示:,大司徒王允,宝刀工厂(负责提供宝刀),校尉曹操,获得七星宝刀的具体工厂,七星宝刀,具体产品(宝刀中的一类,),37,.,创建型模式之一(工厂方法模式,其实我们可以再抽象化一点:大司徒王允拥有很多宝刀,而七星宝刀是其中最好、最锋利的一把,曹操获得的就是这把最锋利的七星宝刀。,OK,!我们已经使用了抽象的概念了!,38,.,创建型模式之一(工厂方法模式,建立产品,1,抽象宝刀,AbstractSword,2,具体宝刀,QixingSword,七星宝刀,建立工厂,1,抽象宝刀工厂,ISwordFactory,生产抽象宝刀,2,具体宝刀工厂,Caocao,生产七星宝刀,故事情节的历史重现,用八星宝刀来考验模式,1,创建八星宝刀,BaxingSword,2,创建具体宝刀工厂,Caocao2,生产八星宝刀,3,让曹操使用八星宝刀刺杀董卓,39,.,创建型模式之一(工厂方法模式,),40,.,创建型模式之一(工厂方法模式,),41,.,创建型模式之一(工厂方法模式,),package com.demo.factory.itf;,import com.demo.factory.model.AbstractSword;,/*,*宝刀工厂,*,*,author Administrator,*,*,/,public interface ISwordFactory,/*,*生产各类宝刀,(,返回值是抽象宝刀类型,),*,*,return,*,/,public AbstractSword createSword();,42,.,创建型模式之一(工厂方法模式,),package com.demo.factory;,import com.demo.factory.itf.ISwordFactory;,import com.demo.factory.model.AbstractSword;,import com.demo.factory.model.object.QixingSword;,/*,*,具体工厂曹操,*,*,author,*,*/,public class Caocao implements ISwordFactory,/*,*,实现,ISwordFactory,接口的,createSword,方法生产七星宝岛*,/,public AbstractSword createSword(),return new QixingSword();,43,.,创建型模式之一(工厂方法模式,),package com.demo.factory.model;,/*,*定义抽象宝刀,*,*,author Administrator,*,*,/,public abstract class AbstractSword,/,宝刀的名称,private String name;,public AbstractSword(),/,获得宝刀名称,public String getName(),return name;,/,设置宝刀名称,public void setName(String name),this.name=name;,44,.,创建型模式之一(工厂方法模式,),package com.demo.factory.model.object;,import com.demo.factory.model.AbstractSword;,/*,*七星宝刀类,*,*,author,*,*,/,public class QixingSword extends AbstractSword,/*,*构造方法设置宝刀名称,*,/,public QixingSword(),this.setName(,七星宝刀,);,45,.,创建型模式之一(工厂方法模式,),package com.demo;,import java.util.HashMap;,import java.util.Map;,import com.demo.factory.Caocao2;,import com.demo.factory.itf.ISwordFactory;,import com.demo.factory.model.AbstractSword;,public class MainApp,/*,*param args,*/,public static void main(String args),/,创建曹操实例对象,返回值使用接口类型,/ISwordFactory swordFactory=new Caocao();,ISwordFactory swordFactory=new Caocao2();,/,获得七星宝刀,AbstractSword sword=swordFactory.createSword();,/,刺杀董卓,System.out.println(,曹操使用,+sword.getName()+,刺杀董卓,);,46,.,创建型模式之一(工厂方法模式),工厂方法模式的优势,能够使得工厂完全自主地创建何种产品对象,而创建这个对象的细节完全封装在具体工厂内部。,在加入新产品的时候,无需修改抽象工厂和抽象产品的接口,无需修改具体工厂和产品,也无需修改客户端,只需增加一个新的具体产品及其相应的工厂就可以了。,工厂方法模式的缺陷,增加新产品时候,需要编写新的具体产品类和相应的具体工厂,类,这两者都比较简单时,系统会有额外的开销。,47,.,创建型模式之一(工厂方法模式),工厂方法模式的适用场景,当一,个类不知道,它所必须创建的对象的类的时候;,类使用它的子类来创建指定的对象。,子类很多需要不断扩展,.,48,.,创建型模式之一(工厂方法模式,49,.,作业,工厂方法模式的适用场景,当一个累不知道它所必须创建的对象的类的时候;,类实用它的子类来创建指定的对象。,50,.,
展开阅读全文