23种设计模式PPT合集

上传人:su****e 文档编号:243755685 上传时间:2024-09-30 格式:PPT 页数:220 大小:2.66MB
返回 下载 相关 举报
23种设计模式PPT合集_第1页
第1页 / 共220页
23种设计模式PPT合集_第2页
第2页 / 共220页
23种设计模式PPT合集_第3页
第3页 / 共220页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,1,、工厂方法模式,主讲:田旭园,程序:奚亮亮,ppt,:叶良波,答问:陈才国,1,页,FACTORY METHOD,请,MM,去麦当劳吃汉堡,不同的,MM,有不同的口味,要每个都记住是一件烦人的事情,我一般采用,Factory Method,模式,带着,MM,到服务员那儿,说,要一个汉堡,,具体要什么样的汉堡呢,让,MM,直接跟服务员说就行了。工厂方法模式:核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。,感谢王良芳大神在校内的分享,新增,20,种模式的形象比喻。缺:简单工厂模式、缺省适配模式和不变模式。,创建模式:简单工厂、工厂方法、抽象工厂、单例、建造、模型;,结构模式:适配器、缺省适配、合成、装饰、代理、享元、门面、桥梁;,行为模式:不变、策略、模板方法、观察者、迭代子、责任链、命令,备忘录、状态、访问者、解释器、调停者。,(,最后三种不讲,),工厂方法模式是类的创建模式,又叫虚拟构造子(,Virtual Constructor,)模式或者多态性工厂(,Polymorphic Factory,)模式。,工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际工作推迟到子类中。,工厂方法解决问题:,工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。,工厂方法缩略图,该模式的优点:,这种抽象的结果,使这种工厂方法模式可以用来允许系统不修改具体工厂角色的情况下引进新产品,这一特点无疑使得工厂模式具有超过简单工厂模式的优越性。,在工厂方法模式中,一般都有一个平行的等级结构,也就是说工厂和产品是对应的的。抽象工厂对应抽象产品,具体工厂对应具体产品。简单的示意图如下:,各种角色分类,抽象工厂角色,:,具体,工厂,角色,:,抽象产品角色,:,具体,产品角色:,7,2,、,简单,工厂模式,主讲人:陈儒,组员:韩政高、戴鹏军、陈群,1,页,8,简单的介绍,简单工厂模式是创建型模式,用于对象的创建,它不属于,23,种,gof,设计模式。它是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现,。,设计模式描述了软件设计过程中某一类常见问题的一般性的解决方案,是解决某个方向上的变动需求的问题。而工厂设计模式的存在是为了解决哪一方面的问题呢?或者说它的动机是什么呢?,9,动机,在软件系统中,经常面临着,“,某个对象,”,的创建工作;由于需求的变化,这个对象经常面临着剧烈的变化,但是它却拥有比较稳定的接口。,如何应对这种变化?如何提供一种,“,封装机制,”,来隔离出,“,这个易变对象,”,的变化,从而保持系统中,“,其他依赖该对象的对象,”,不随着需求改变而改变?,10,优缺点,优点:简单工厂模式主要用于隔离类对象的使用者和具体类型之间的耦合关系。面对一个经常变化的具体类型,紧耦合关系会导致软件的脆弱。通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责,“,消费,”,对象就可以了。而不必管这些对象究竟如何创建及如何组织的明确了各自的职责和权利,有利于整个软件体系结构的优化。,缺点:由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。,3,、,抽象工厂模式,by:,缪丹权,柳敏乾,李青振,2,页,FACTORY,追,MM,少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是,MM,爱吃的东西,虽然口味有所不同,但不管你带,MM,去麦当劳或肯德基,只管向服务员说,来四个鸡翅,就行了。麦当劳和肯德基就是生产鸡翅的,Factory,工厂模式:客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如何创建及如何向客户端提供。,抽象工厂模式定义,对象创建型模式,又称,Kit,模式。,在,中对,Abstract Factory,的意图是这,样描述的:为了创建一组相关或相互依赖的对象提供,一个接口,而且无需指定它们的具体类。,有时候,几个对象需要一种协调的方式实例化。例如,,在处理用户界面时,系统可能在一个操作系统上用,一组对象,在另一个系统上用另一组对象。,Abstract Factory,确保系统根据情况获得正确的对象。,产品族,产品族,是指位于不同产品等级结构中,功,能相关联的产品组成的家族。比如下图中,箭,头所指就是三个功能相关联的产品。它们位于,三个不同的等级结构中的相同位置上,组成了,一个产品族。,为什么需要,AF,为什么需要,AF,如果,现在有三个相似的工厂等级结构,那么采,用工厂方法模式就势必要使用三个独立的工厂等级,结构。由于三个等级结构相似性,会导致三个平行,的等级结构。随着产品等级结构的数目增加,工厂,方法模式所给出的工厂等级结构的数目也会增加。,抽象工厂模式结构图,结构与角色,抽象工厂,(AbstractFactory),角色:,担任这个角色的是工厂方法模式的核心,它是与应用系统的商业逻辑无关的。通常使用,JAVA,接口或者抽象,JAVA,类来实现,而所有的具体工厂类必须实现该接口或者继承抽象类。,具体工厂类,(Conrete Factory),角色:,这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑。通常使用具体类来实现这个角色。,抽象产品,(Abstract Product),角色:,担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。通常使用接口或者抽象类来实现这一角色。,具体产品,(Concrete Product),角色,:,抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。通常使用具体,JAVA,类来实现。,抽象工厂模式时序图,在客户新建一个抽象工厂的时候,其实是新建了一个具体的工厂,然后再通过,该具体工厂来创建各种具体的产品。,抽象工厂模式优缺点,优点:,程序设计中有三种耦合:零耦合、抽象耦合、具体耦合。抽象工厂设计可以很好的把具体耦合转换到抽象耦合来减少耦合程度。,具体产品从客户代码中被分离出来。,容易改变产品的系列。,将一个系列的产品族统一到一起创建。,抽象工厂模式优缺点,缺点:,由于每个类的产生都要继承抽象类(或接口),并由工厂来创建,这样就增加了代码长度和工作量。,在产品族中扩展新的产品是很困难的,它需要修改抽象工厂的接口。,使软件结构更复杂。,与其他模式的区别和联系,与工厂模式的区别:,工厂方法模式是一种极端情况的抽象工厂模式,而抽象工厂模式可以看成是工厂方法模式的推广。,工厂方法模式用来创建一个产品的等级结构的,而抽象工厂模式是用来创建多个产品的等级结构的。,工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个抽象产品类。,总结,工厂的实现通常使用,Singleton,模式。一个应用中一般每个系列产品只需要使用一个具体工厂的实例。,抽象工厂模式提供了一个创建一系列相关或相互依赖的对象的接口,关键点在于应对,”,多系列对象创建”的需求变化。,学会抽象工厂模式,可以更好地理解面向对象中的原则:,面向接口编程,而不要面向实现编程。,组员:汤仲喆 王凯 李义冬,主讲:汤仲喆,代码:王凯,答辩:李义冬,4,、,The,Singleton,Pattern,(单例模式),1,页,SINGLETON,俺有,6,个漂亮的老婆,她们的老公都是我,我就是我们家里的老公,Sigleton,,她们只要说道,老公,,都是指的同一个人,那就是我,(,刚才做了个梦啦,哪有这么好的事,),单例模式:单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例单例模式。单例模式只应在有真正的,单一实例,的需求时才可使用。,什么是单例模式,顾名思义,单例模式的意思就是只有一个实例。单例模式确保某一个类,只有一个实例,,而且,自行实例化,并,向整个系统提供这个实例,。这个类称为单例类。,单例模式的要点,(,1,)某个类只能有一个实例;,(,2,)它必须自行创建这个实例;,(,3,)它必须自行向整个系统提供这个实例。,解决方案,-,单例模式,意图:希望类只有一个实例,但没有控制类实例化的全局变量(对象)。同时希望确保所有客体对象使用该类的相同实例,而无需将引用传给它们。,问题:几个不同的客户对象需要引用同一个对象,而且希望确保这种类型的对象数目不超过一个。,解决方案:保证一个实例,参与者与协作者:客户对象只能通过,getInstance(),方法创建单例类的实例。,效果:客户对象无需操心是否存在单例类的实例,实例化有单例类自己控制。,实现:,一个引用单例对象的静态私有成员变量,一个公共静态方法,负责实现一次性的实例化并返回对单例对象的引用,设置为保护或私有的构造方法,单例模式的关键特征,单例模式设计会产生什么问题?,在多线程程序中,,Singleton,模式可能会出现一个问题。,假设对,getInstance(),方法的两个调用几乎同时发生,这种情况可能非常糟糕。此时会发生什么?,1.,第一个线程检查实例是否存在。因为实例不存在,该线程执行创建第一个实例的代码部分。,2.,然而,假设在实例化完成之前,另一个线程也来检查实例成员变量是否为,null,。因为第一个线程还什么都没有创建,实例成员变量仍然等于,null,,所以第二个线程也执行了创建一个对象的代码。,3.,现在,两个线程都执行了,Singleton,对象的,new,操作,因此创建了两个重复的对象。,懒汉式,VS,饿汉式,所以,到底使用哪一种方式,要看实际的需求。,饿汉式:静态初始化方式,,在启动加载单例类时就实例化对象,只实例化一次,以后用到的时候就不需要再去实例化了,加载类的时候速度比较慢,但以后获得对象时的速度比较快,该对象从加载到应用结束一直占用资源。,懒汉式:,相当于一个延迟加载机制,即你需要这个对象时候才去实例化,加载类的时候速度比较快,但以后获得对象时的速度比较慢,该对象在整个应用的生命周期只有一部分时间占用资源。面临多线程访问的安全性问题,需要做双重锁定处理才可以保证安全。,单例模式的应用,一个随机数产生的例子,在整个应用程序中只需要一个类的实例来产生随机数,客户端程序从类中获取这个实例,调用这个实例的方法,nextInt(),,公用的方法访问需要进行同步,这是单例模式需要解决的同步问题。,参与者:,Singleton,定义一个,Instance,操作,允许客户访问它的唯一实例,,Instance,是一个类操作,负责创建自己的唯一实例。,协作关系:客户只能通过,Singleton,的,Instance,操作访问一个,Singleton,的实例。,主讲:范允易,小组成员,:,陈巧燕、刘秀颖、郭娟,5,、建造者模式,(,Builder Pattern,),-,创建型模式,1,页,BUILDERMM,最爱听的就是,我爱你,这句话了,见到不同地方的,MM,要能够用她们的方言跟她说这句话哦,我有一个多种语言翻译机,上面每种语言都有一个按键,见到,MM,我只要按对应的键,它就能够用相应的语言说出,我爱你,这句话了,国外的,MM,也可以轻松搞掂,这就是我的,我爱你,builder,。(这一定比美军在伊拉克用的翻译机好卖)建造模式:将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。,概述,Builder,模式是一种创建型模式,它主要是应对项目中一些复杂对象的创建工作。,所谓“复杂对象”是指:此对象中还含有其它的子对象。,意图:,将,一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。,-,设计模式,GOF,Builder,模式,结构,建造者(,Builder,)角色,具体建造者(,Concrete Builder,)角色,产品(,Product,)角色,指导者(,Director,)角色,时序图,优缺点和适用性,解耦了组装过程和创建具体部件,职责分离,精细的控制创建过程,难于应付,“,分步骤构建算法,”,的需求变动,适用性:,复杂的内部结构,相互依赖的各部分,创建过程独立,各部分变化剧烈,组合算法相对稳定,相关模式,抽象工厂(,Abstract Factory,)模式,共性,:创建型模式、创建类对象,区别,:,Abstract Factory,模式:解决,“,系列对象,”,的需求变化,Builder,模式:解决,“,对象部分,”,的需求变化,总结,Builder,模式的实质是,:,解决一个复杂对象的创建工作。明确变化的部分和相对稳定的部分,隔离变化,解耦稳定的组装过程和变化的具体部件,使得我们不用去关心每个部件是如何组装的;如何将具体部件和组装算法隔离是要解决的问题。,什么是原始模型模式?,属于对象的创建模式。,通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象。,结构:,第一种是简单形式,第二种是登记形式,6,、原始模型模式,小组分工:,做报告:郑迟,回答问题:徐冰,俞栋辉,代码:王炜,2,页,PROTOTYPE,跟,MM,用,QQ,聊天,一定要说些深情的话语了,我搜集了好多肉麻的情话,需要时只要,copy,出来放到,QQ,里面就行了,这就是我的情话,prototype,了。(,100,块钱一份,你要不要)原始模型模式:通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方法创建出更多同类型的对象。原始模型模式允许动态的增加或减少产品类,产品类不需要非得有任何事先确定的等级结构,原始模型模式适用于任何的等级结构。缺点是每一个类都必须配备一个克隆方法,。,简单形式,这种形式涉及到三个角色:,客户(,Client,)角色:客户类提出创建对象的请求。,抽象原始(,Prototype,)角色:这是一个抽象角色,通常由一个,java,接口或,java,抽象类实现。此角色给出所有的具体原始类所需要的接口。,具体原型(,Concrete Prototype,)角色:被复制的对象。此角色需要实现抽象的原型角色所要求的接口。,简单形式,UML,图,登记形式,这种形式涉及到三个角色:,客户端,(,Client,)角色:客户端类向管理员提出创建对象的请求。,抽象,原型(,Prototype,)角色:这是一个抽象角色,通常由一个接口或抽象类实现。,此,角色给出所有的具体原型类所需要的接口。,具体,原型(,ConcretePrototype,)角色:被复制的对象。需要实现抽象原型角色所要求的接口。,原型,管理器(,PrototypeManager,)角色:创建具体原型类的对象,并记录每一个被创建的对象,。,登记形式,UML,图,两种形式的比较,简单形式和登记形式的原始模型模式各有其长处和短处。,1,)如果需要,创建的原型对象数目较少而且比较固定的话,,可以采取第一种形式,也即简单形式的原始模型模式。,在这种情况下,原型对象的引用可以由客户端自己保存。,2,)如果要创建的原型对象,数目不固定,的话,可以采取第二种形式,也即登记形式的原始模型模式。在这种情况下,,客户端并不保存对原型对象的引用,,这个任务被,交给管理员对象,。在复制一个原型对象之前,客户端可以查看管理员对象是否已经有一个满足要求的原型对象。如果有,可以直接从管理员类取得这个对象引用;如果没有,客户端就需要自行复制此原型对象。,模式的实现,1,):浅复制(浅克隆)被复制对象的所有变量都含有与原来的对象相同的值,而,所有的对其他对象的引用都仍然指向原来的对象,,,换言之,,,浅,复制仅仅复制所考虑的对象,而不复制它所引用的对象。,2,):深复制(深克隆)被复制对象的所有的变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些,引用其他对象的变量,将指向,被复制过的新对象,而不再是原有的那些被引用的对象,。换言之,深复制把要复制的对象所引用的对象都复制,了一,遍,而这种对被引用到的对象的复制叫做间接复制。,模式的实现,利用串行化来作深复制把对象,写到流里,的过程是串行化(,Serilization,)过程,非常形象的称为“冷冻”或是“腌咸菜”过程。而把对象,从流中读出来,的并行化(,Deserialization,)过程叫做“解冻”或是“回鲜”过程。写到流里的是对象的一个拷贝,而原来对象仍然存在于,JVM,里面,因此“腌成咸菜”(串行化)的只是对象的一个拷贝。,java,咸菜(并行化)还可以回鲜。,模式的实现,串行化的结构图,浅复制,UML,图,深复制,UML,图,原始模型模式的优缺点,特有的优点(,1,):原始模型模式原许动态地增加或减少产品类。由于创建产品类实例的方法是产品类内部具有的,因此,增加新产品对整个结构没有影响。(,2,):原始模型模式提供简化的创建结构。工厂方法模式常常需要有一个与产品类等级结构相同的等级结构,而原始模型模式就不需要这样。(,3,):具有给一个应用软件动态加载新功能的能力。例如,一个分析,Web,服务器的记录文件的应用软件,针对每一种记录文件格式,都可以由一个相应的“格式类”负责。如果出现了应用软件所不支持的新的,Web,服务器,只需要提供一个格式类的克隆,并在客户端登记即可,而不必给每个软件的用户提供一个全新的软件包。(,4,):产品类不需要非得有任何事先确定的等级结构,因为原始模型模式适合用于任何的等级结构。,主要缺点:每一个类都必须配备一个克隆方法,配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类来说不是很难,而对于已经有的类不一定很容易,特别是当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候。,7,、,The Adaptor,Pattern,(适配器模式),主讲:顾祝燕,组员:耿惠、何振芬、朱金凤,2,页,ADAPTER,在朋友聚会上碰到了一个美女,Sarah,,从香港来的,可我不会说粤语,她不会说普通话,只好求助于我的朋友,kent,了,他作为我和,Sarah,之间的,Adapter,,让我和,Sarah,可以相互交谈了,(,也不知道他会不会耍我,),适配器(变压器)模式:把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口原因不匹配而无法一起工作的两个类能够一起工作。适配类可以根据参数返还一个合适的实例给客户端。,面向对象软件系统的适配问题,假设我们已经有一个软件系统,原来使用了一个第三方类库,A,。现在有一个新的第三方类库,B,,其功能等各方面都更加强大。我们希望用,B,来替换,A,,以改善我们的系统。但是,B,的接口与,A,不一样。那怎么办呢?,Adapter,模式,定义,将一个类的接口转换成客户端所期望的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。,别名,包装器,Wrapper,Adapter,模式,动机,有时,为复用而设计的,工具箱类,不能够被复用的原因仅仅是因为它的接口与专业应用领域所需要的,接口不匹配(名称不一样,参数不一样,等等),。,我们可以改变工具箱类使它兼容专业领域中的类的接口,但前提是必须有这个工具箱的源代码。然而即使我们得到了这些源代码,修改工具箱也是没有什么意义的;因为不应该仅仅为了实现一个应用,工具箱就不得不采用一些与特定领域相关的接口。动机(续),我们可以不用上面的方法,而定义一个适配器类,由它来适配工具箱的接口和专业应用的接口。我们可以用两种方法做这件事:,1),继承专业应用类的接口和工具箱类的实现。这种方法对应,A d a p t e r,模式的类版本(多继承),2),将工具箱类的实例作为适配器类的组成部分,并且使用工具箱的接口实现适配器类。这种方法对应,A d a p t e r,模式的对象版本。,Adapter,模式,适用性,以下情况使用,A d a p t e r,模式,你想使用一个已经存在的类,而它的接口不符合你的需求。,你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。,Adapter,模式,结构(类版本),Adapter,模式,结构(对象版本),基于类的,Adapter,模式,基于类的,Adapter,模式的一般结构如下:,Adaptee,类为,Adapter,的父类,,Adaptee,类为适配源,适配目标(接口)也是,Adapter,的父类;基于类的,Adapter,模式比较适合应用于,Adapter,想修改,Adaptee,的部分方法的情况。,基于对象的,Adapter,模式,基于对象的,Adapter,模式的一般结构如下:,Adaptee,类对象为,Adapter,所依赖,适配目标(接口)是,Adapter,的父类;,基于对象的,Adapter,模式比较适合应用于,Adapter,想为,Adaptee,添加新的方法的情况。但在,Adaptee,类的方法与,Adapter,类的方法不同名而实现相同功能的情况下,我们一般也使用基于对象的,Adapter,模式,,Adapter,模式,参与者,Ta r g e t,C l i e n t,使用的与特定领域相关的,“,接口,”,。,C l i e n t,与符合,Ta rg e t,接口的对象协同的专业系统。,A d a p t e e,一个已经存在的,“,接口,”,,它具有,Client,要求的功能但不符合,Client,的接口要求。这个接口需要适配。,A d a p t e r,对,A d a p t e e,的接口与,Ta rg e t,接口进行适配,Adapter,模式,协作,Client,在,A d a p t e r,实例上调用一些操作(请求)。接着适配器调用,A d a p t e e,的操作实现这个请求。,效果(类适配器和对象适配器有不同的权衡),类适配器,用一个具体的,A d a p t e r,类对,A d a p t e e,和,Ta rg e t,进行匹配。结果是当我们想要匹配一个类以及所有它的子类时,类,A d a p t e r,将不能胜任工作。,使得,A d a p t e r,可以重定义,A d a p t e e,的部分行为,因为,A d a p t e r,是,A d a p t e e,的一个子类。,仅仅引入了一个对象,并不需要额外的指针以间接得到,a d a p t e e,。,Adapter,模式,效果(类适配器和对象适配器有不同的权衡),对象适配器则,允许一个,A d a p t e r,与多个,A d a p t e e,即,A d a p t e e,本身以及它的所有子类(如果有子类的话)同时工作。,A d a p t e r,也可以一次给所有的,A d a p t e e,添加功能。,使得重定义,A d a p t e e,的行为比较困难。这就需要生成,A d a p t e e,的子类并且使得,A d a p t e r,引用这个子类而不是引用,A d a p t e e,本身。,8,、缺省,适配模式(,Default Adapter,),-,杨鹏、余晖、许超杰,1,页,问题的提出:鲁智深的故事,这个抽象的天星类便是一个适配器类,鲁智深实际借助于适配器类模式达到了剃度的目的。此适配器类实现了和尚接口所要求的所有方法。但是与通常的适配器模式不同的是,此适配器类给出所有的方法的实现都是“平庸”的。这种“平庸化”的适配器模式称作,缺省适配模式,缺省适配模式,(Default Adapter),一、概述,缺省适配模式为一个接口提供缺省实现,这样子类型可以从这个缺省实现进行扩展,而不必从原有接口进行扩展。当不需要全部实现适配器接口提供的方法时,可先设计一个抽象类实现适配器接口,并为接口中每个方法提供一个默认实现(空方法)。那么该抽象类的子类可有选择地覆盖父类的某些方法来实现需求。,二、结构,缺省适配模式,(Default Adapter),Public interface AbstractService, void serviceOperation1();,int serviceOperation2();,String serviceOperation3();,Public class ServiceAdapter,implements AbstractService,public void serviceOperation1(),public int serviceOperation2()return 0; public String serviceOperation3()return null;,缺省适配模式小结,在任何时候,如果不准备实现一个接口的所有方法时,就可以模仿,WindowApdapter,的做法制造一个抽象类,给出所有方法的平庸的实现。这样从这个抽象类继承下去的子类就不必实现所有的方法了。,适配器模式把一个类的接口换成客户端所期待的另一个接口。缺省适配模式,-,适配器模式的“平庸化”形式可以使所考察的类不必实现不需要的那部分接口。,9,、,composite(,合成,),模式,讲解人:陈敖,其他成员:黄文,林丽丽,林温柔,2,页,COMPOSITEMary,今天过生日。,我过生日,你要送我一件礼物。,嗯,好吧,去商店,你自己挑。,这件,T,恤挺漂亮,买,这条裙子好看,买,这个包也不错,买。,喂,买了三件了呀,我只答应送一件礼物的哦。,什么呀,,T,恤加裙子加包包,正好配成一套呀,小姐,麻烦你包起来。,.,,,MM,都会用,Composite,模式了,你会了没有?合成模式:合成模式将对象组织到树结构中,可以用来描述整体与部分的关系。合成模式就是一个处理对象的树结构的模式。合成模式把部分与整体的关系用树结构表示出来。合成模式使得客户端把一个个单独的成分对象和由他们复合而成的合成对象同等看待。,Composite,模式,别名:部分,-,整体模式;组合模式;合成模式,要点:如何设计单个对象和组合对象,使他们具有一致的操作接口。,Composite,模式把部分和整体关系用树结构表示,是属于对象的结构模式。,Composite,模式要对,Composite,的对象进行管理,所以在一定位置给予对象的相关管理方法,如:,add(),remove(),等,.,Composite,模式中对象的管理有两种方案。,安全方式:此方式只允许树枝构件有对象的管理方法。,透明方式:此方式只允许树枝和树叶都有对象的管理方法,但树叶对象中的管理方法无实际意义。,组成部分:,component,构件:抽象组合对象的公共行为接口,leaf,构件:树叶对象,没有下级子对象,composite,构件:树枝对象,树枝对象可以包含一个或多个其他树枝或树叶对象,UML,示意图:,安全方式:,透明方式:,安全式特点:错误地调用会导致编译时出错,透明式特点:编译时不会出错,错误地调用会导致抛出异常,优点,:,可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,使得增加新构件也更容易。,客户端调用简单,客户端可以一致的使用组合结构或其中单个对象。,定义了包含叶子对象和容器对象的类层次结构,叶子对象可以被组合成更复杂的容器对象,而这个容器对象又可以被组合,这样不断递归下去,可以形成复杂的树形结构。,很容易在组合体内加入对象构件,客户端不必因为加入了新的对象构件而更改原有代码。,缺点,:,设计变得更加抽象,,对象的业务规则如果很复杂,则实现组合模式具有很大挑战性,而且不是所有的方法都与叶子对象子类都有关联。,增加新构件时可能会产生一些问题,,很难对容器中的构件类型进行限制,。,适用环境,:,需要表示一个,对象整体或部分层次,,在具有整体和部分的层次结构中,希望通过一种方式忽略整体与部分的差异,可以一致地对待它们。,让客户能够忽略不同对象层次的变化,,客户端可以针对抽象构件编程,无需关心对象层次结构的细节,。,对象的结构是动态的并且复杂程度不一样,但客户需要一致地处理它们,。,10,、装饰,模式,Presented by,马庆 沈月云 彭怡然 姚敏,2,页,DECORATORMary,过完轮到,Sarly,过生日,还是不要叫她自己挑了,不然这个月伙食费肯定玩完,拿出我去年在华山顶上照的照片,在背面写上,最好的的礼物,就是爱你的,Fita,,再到街上礼品店买了个像框(卖礼品的,MM,也很漂亮哦),再找隔壁搞美术设计的,Mike,设计了一个漂亮的盒子装起来,.,,我们都是,Decorator,,最终都在修饰我这个人呀,怎么样,看懂了吗?装饰模式:装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,提供比继承更多的灵活性。动态给一个对象增加功能,这些功能可以再动态的撤消。增加由一些基本功能的排列组合而产生的非常大量的功能,。,Company Logo,1.,装饰模式介绍,意图,动态地给一个对象添加一些额外的职责。就增加功能来说,,Decorator,模式比生成子类更为灵活,Decorator,模式,工作原理,可以创建始于,Decorator,对象(负责新功能的对象)终于原对象的一个对象“链”,Company Logo,1.,装饰模式介绍,装饰模式的定义,装饰模式可以动态的给一个对象附加一些功能。,使用装饰模式扩展功能不会产生类爆炸。它采用的是合成方式,比继承方式更加灵活。,装饰模式要解决的问题,提供一种修改类的行为,而避免创建众多的派生类的途径。,Company Logo,3.,讨论,面向对象设计的开,-,闭原则,类应该对扩展开放,对修改封闭。,目的是在不需修改已有代码的情况下方便的扩展类的功能。按照这一原则设计的系统具有以下优点,:,具有一定的适应性和灵活性。,具有一定的稳定性和延续性。,“对扩展开放,对修改封闭。,”,这听起来自相矛盾啊!有哪些方法可以不修改已有代码但又能扩展其功能?,何时使用开闭原则?,Company Logo,3.,讨论,何谓装饰?如何装饰?,所谓装饰就是将一个对象包装起来。,在程序上也就是让一个对象,a,包含另一个对象,b,。,a,对应的类,A,是“装饰类”,,b,对应的类,B,是被装饰类。,如果要让装饰可以重复,且不必考虑次序,那么装饰的要点是装饰者和被装饰者具有,相同的类型,(有共同的父类)。,Company Logo,3.,讨论,首先生成一个,DarkRoast,对象,DarkRoast,Cost(),DarkRoast,继承了,Beverage,,拥有一个计算饮料价格的方法,cost(),。,Company Logo,3.,讨论,Mocha,Cost(),然后,DarkRoast,Cost(),Mocha,对象是装饰者,他与被它装饰的对象,DarkRoast,具有相同的类型(是,Beverage,的子类),也有一个,cost(),方法。,顾客想要,mocha,,所以我们创建一个,Mocha,对象,并用它包装,DarkRoast.,Company Logo,3.,讨论,再然后,Mocha,Cost(),DarkRoast,Cost(),whip,对象是装饰者,他与被它装饰的对象,DarkRoast,具有相同的类型,也有一个,cost(),方法。,顾客还想要,whip,,所以我们创建一个,Whip,对象,并用它包装,Mocha.,Whip,Cost(),Company Logo,3.,讨论,计算饮料的价格,Mocha,Cost(),DarkRoast,Cost(),调用最外层的装饰者,whip,的,cost(),whip,再将计算任务,委派,给被它包装的对象,得到一个价格后,再加上,whip,自己的价格,.,Whip,Cost(),5.00,5.00+0.50,5.50+1.00,6.50,Company Logo,Diagram,Design,所谓委派就是一个对象将工作(或工作的一步分)交给另一个对象来完成。,Design,在装饰模式中,委派是指,装饰对象,将任务交给,被装饰对象,来完成。,Design,委派可以传递,最终必须要有一个,干实事的对象,。,何谓委派?,Company Logo,3.,讨论,装饰者在委派它装饰的,对象作某种处理时,可,以添加上自己的行为,(功能扩展)(在委派,之前或,/,和之后)。,装饰者与被装饰者,具有相同的类型,对象可以在任何时候被,装饰,因此我们能在运,行时动态的装饰对象。,可以用多个装饰,者装饰一个对象,由于,装饰者与被装饰者,具有相同的类型,我们,可以用装饰后的对象代,替原来的对象。,要点,Company Logo,HouseBlend,Cost(),Beverage,description,getDescription(),Cost(),/Other methods,DarkRoast,Cost(),Decaf,Cost(),Espresso,Cost(),CondimentDec,orator,getDescription(),Mocha,Beverage beverage,getDescription(),Cost(),Whip,Beverage beverage,getDescription(),Cost(),具体的咖啡品种,调味品装饰者,不仅实现,cost(),还要实现,getDescription(),考虑一下本讲开头的引例是如何实现的。,咖啡店的类图,Proxy pattern,11,、,代理模式,小组成员:王建奇,王洪军,嵇海锋,吴水生,2,页,PROXY,跟,MM,在网上聊天,一开头总是,hi,你好,你从哪儿来呀?,你多大了?,身高多少呀?,这些话,真烦人,写个程序做为我的,Proxy,吧,凡是接收到这些话都设置好了自动的回答,接收到其他的话时再通知我回答,怎么样,酷吧。代理模式:代理模式给某一个对象提供一个代理对象,并由代理对象控制对源对象的引用。代理就是一个人或一个机构代表另一个人或者一个机构采取行动。某些情况下,客户不想或者不能够直接引用一个对象,代理对象可以在客户和目标对象直接起到中介的作用。客户端分辨不出代理主题对象与真实主题对象。代理模式可以并不知道真正的被代理对象,而仅仅持有一个被代理对象的接口,这时候代理对象不能够创建被代理对象,被代理对象必须有系统的其他角色代为创建并传入。,代理模式的,定义,代理模式(,Proxy Pattern,),为其他对象提供一种代理以控制对这个对象的访问。在某些情况下 ,一个客户不 想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。,代理,指的就是一个角色代表另一个角色采取行动,就象在实验室,用代理上网,我们设置一个代理地址把任何,http,请求转发到代理软件,ccporxy,或者,squid,代理软件再去请求实际的,web,服务器,而它把获得的结果返回给用户,结束一次访问。,代理模式,的基本,UML,类图,Subject obj = new Proxy (),代理模式的基本时序图,代理模式一般涉及到的角色,抽象主题,(Subject),它是一个对象和它的代理所公用的接口,即,realsubject,和,proxy,实例所实现的接口,这样就在任何使用,realsubject,的地方都可以使用,Proxy,。,实际主题,(RealSubject),实现抽象主题接口的类。,代理,(Proxy),实现抽象主题接口的类,代理含有主题接口声明的变量,用来存放,realsubject,角色的实例引用,这样就可以控制对它所代理对象的访问。,代理模式的应用,一般来说分为几种:,远程(,Remote,)代理:也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。,虚拟(,Virtual,)代理:根据需要将一个资源消耗很大或者比较复杂的对象延迟的真正需要时才创建。 比如说你打开一个很大的,HTML,网页时,里面可能有很多的文字和图片,但你还是可以很快的打开它,此时你所看到的是所有的文字,但图片却是一张张的下载后才能看到。那些未打开的图片框,就是通过虚拟代理来代替了真实的图片,此时代理存储了真实图片的路径和尺寸。,保护(,Protect or Access,)代理:控制对一个对象的访问权限。一般用于对象有 不同权限的时候。,智能引用(,Smart Reference,)代理:当调用真实对象时,代理出来另外一些事,提供比对目标对象额外的服务。 如:计算真实对象的引用次数,这样当该对象没有引用时,可以自动释放它;或当第一次引用一个持久对象时,将它装入内存;或在访问一个实际对象前,检查是否已经锁定它,以确保其它对象不能改变它。它们都是通过代理在访问一个对象时附加一些内务处理。,动机,1.,为了在我们确实需要这个对象是才对它进行创建和初始化。,2.,用户希望程序和某个对象打交道,程序不希望用户直接访问该对象,为什么要使用,Proxy,模式?,代理模式的作用,Proxy,模式在访问对象时引入了一定程度的间接性。根据代理的类型,附加的间接性有多种用途:,(1),远程代理可以隐藏一个对象存在于不同地址空间的事实。,(2),虚代理可以进行最优化,例如根据要求创建对象。,(3),保护代理和智能指针都允许访问一个对象时有一些附加的内务处理。,远程,代理(,Remote Proxy,),为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。,RMI(remote method invocation),是一种分布式技术,使用,RMI,可以让一个虚拟机上的应用程序请求调用位于网络上另一个,JVM,上的对象方法。,RMI,不希望客户应用程序直接与远程对象打交道,代替地让应用程序和远程对象的代理打交道。,RMI,会生成一个存根:一种特殊的字节码,并让这个存根产生的对象作为远程对象的代理,即远程代理。,虚代理,代理通常拥有与实际对象基本相同的接口。代理的工作方式是:把服务请求明智地转发给代理控制的底层对象,最终完成任务。,对于大数据量的加载,,VirtualProxy,模式可以让加载在后台进行,前台用的,Prxoy,对象使得整体运行速度加快。,虚,代理例子,在文档中嵌入图形对象的文档编辑器,有些图形对象的创建开销很大。但是打开文档必须很迅速,因此我们在打开文档时避免一次性创建所有开销很大的对象。意味着应该根据需要进行创建,我们使用一个图像代理,替代那个真的图像,能够实现这个需求。,保护代理,控制对一个对象的访问权限。一般用于不同客户对对象拥有 不同访问权限的时候。,结构上,保护代理和远程代理以及虚代理是极为相似的,只是在请求访问真实对象时提供的功能不同。,区别:远程代理向客户隐藏了远端机器或进程上的对象,虚代理负责管理了真实对象的加载方式。而保护代理则为用户访问对象的权限进行管理,12,、享元模式,王萌(讲课),黄万德(,PPT,、代码),王勋(回答问题),1,页,FLYWEIGHT,每天跟,MM,发短信,手指都累死了,最近买了个新手机,可以把一些常用的句子存在手机里,要用的时候,直接拿出来,在前面加上,MM,的名字就可以发送了,再不用一个字一个字敲了。共享的句子就是,Flyweight,,,MM,的名字就是提取出来的外部特征,根据上下文情况使用。享元模式:,FLYWEIGHT,在拳击比赛中指最轻量级。享元模式以共享的方式高效的支持大量的细粒度对象。享元模式能做到共享的关键是区分内蕴状态和外蕴状态。内蕴状态存储在享元内部,不会随环境的改变而有所不同。外蕴状态是随环境的改变而改变的。外蕴状态不能影响内蕴状态,它们是相互独立的。将可以共享的状态和不可以共享的状态从常规类中区分开来,将不可以共享的状态从类里剔除出去。客户端不可以直接创建被共享的对象,而应当使用一个工厂对象负责创建被共享的对象。享元模式大幅度的降低内存中对象的数量,。,享元模式,运用,共享技术,有效地支持大量细粒度的,对象,模式结构中的四种角色,1.,享元接口(,Flyweight,),2.,具体享元,(Concrete,Flyweight,),3.,享元工厂,(Flyweight Factory),4.,客户端,(Client),类 图,享元模式的,特点,享元模式的意图是通过共享有效支持大量细粒度的对象,来提供应用程序的性能,节省系统中重复创建对象实例的性能,消耗,这个,怎么理解呢,?,1,、当我们系统中某个对象类型的实例较多的情况。,2,、并且要求这些实例进行分类后,发现真正有区别的分类很少的情况。,享元模式的使用,场景,1,、当我们发现某个类型的对象有大量的实例时,我们是否可以对这些实例进行分类,经过分类后,我们发现只有很少的类别的情况下。,2,、我们发现通过使用享元模式后能够提高系统的性能和不会带来更多的复杂度时。,享元模式的优点,使用享元可以节省内存的开销,特别适合处理大量细粒度对象,这些对象的许多属性值是相同的,而且一旦创建则不容许修改,享元模式中的享元可以使用方法的参数接受外部状态中的数据,但外部状态数据不会干扰到享元中的内部数据,这就使得享元可以在不同的环境中被共享,13,、,Faade(,门面,),模式,主讲:汪庆锋,组员:沈仙桥、阮金晶、毛泉涌,2,页,FACADE,我有一个专业的,Nikon,相机,我就喜欢自己手动调光圈、快门,这样照出来的照片才专业,但,MM,可不懂这些,教了半天也不会。幸好相机有,Facade,设计模式,把相机调整到自动档,只要对准目标按快门就行了,一切由相机自动调整,这样,MM,也可以用这个相机给我拍张照片了。门面模式:外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。每一个子系统只有一个门面类,而且此门面类只有一个实例,也就是说它是一个单例模式。但整个系统可以有多个门面类,。,4.Facade,模式登场,定义:将子系统中的各类(或结构与方法)整合成一个简明一致的界面,隐藏子系统的复杂性,使子系统更加容易使用。,4.Facade,模式登场,(,续,),简单结构图,Facade,Client2,Client1,Client3,subsystem,4.Facade,模式登场,(,续,),模式实现,定义一个(或多个)具备所需接口的新类(门面类),新类(门面类)使用原有的系统,客户使用门面类对象与原系统打交道,6.,模式剖析,结合前面的,Facade,模式结构图来分析周星星看病这个实际例子:图中的,subsystem,对应了挂号、划价、缴费、取药这些操作集合;,Facade,对应了接待员,Receptionist,对象;然后,Client,对应了病人周星星。,6.,模式剖析,(,续,),接待员,Receptionist,对象将子系统中的多个接口重新封装成一个更高层、更简单的接口供,Client,使用,将子系统的复杂性隐藏起来,将子系统与,Client,的联系解耦。,用户不必关心子系统的运作方式,只需和,Facade,也即,Receptionist,对象打交道,完成自己所需的工序。,7.,模式优点,它对客户屏蔽子系统组件,因而减少了客户处理的对象的数目并使得子系统使用起来更加方便。,它实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件往往是紧耦合的。,如果应用需要,它并不限制用户使用子系统类,因此你可以在系统易用性和通用性之间加以选择。,8.,模式适用场合,当你要为一个复杂子系统提供一个简单接口时。,客户只需要使用某个复杂系统的子集,或者需要以一种特殊的方式与系统交互。,希望封装或者隐藏原系统时。,9.,迪米特法则,只与你直接的朋友们通信。,迪米特法则要求一个对象的相互作用是短程的,朋友的数目越少越好,其实质是减少耦合度。,Facade,模式符合迪米特法则。,10.,模式的变体,典型的门面模式强调不应该引入新的功能。,门面模式的变体可以适当引入新的功能,补充系统的原有功能。,11.,模式的原理,Facade,模式将类重新设计,将原来分散的类,/,结构及方法重新组合,形成新的、统一的接口,供上层应用使用。,在某种意义上与,Adapter,及,Proxy,有类似之处。,12.,相关模式的异同点,Proxy,注重在为,Client-Subject,提供一个访问的中间层,使应用程序无需去考虑平台及网络造成的差异及其它诸多技术细节。,Adapter,注重对接口的转换与调整。,Facade,所面对的往往是多个类或其它程序单元,通过重新组合各类及程序单元,对外提供统一的接口,/,界面。,14,、 桥梁模式,(,Bridge Pattern,),-,结构型模式,主讲:赵振钢,小组成员:章国栋、郑书声、张勤锋,1,页,BRIDGE,早上碰到,MM,,要说早上好,晚上碰到,MM,,要说晚上好;碰到,MM,穿了件新衣服,要说你的衣服好漂亮哦,碰到,MM,新做的发型,要说你的头发好漂亮哦。不要问我,早上碰到,MM,新做了个发型怎么说,这种问题,自己用,BRIDGE,组合一下不就行了桥梁模式:将抽象化与实现化脱耦,使得二者可以独立的变化,也就是说将他们之间的强关联变成弱关联,也就是指在一个软件系统的抽象化和实现化之间使用组合,/,聚合关系而不是继承关系,从而使两者可以独立的变化,。,桥梁模式的定义和目的,定义:将抽象和实现解耦,使得两者可以独立地变化。,桥梁模式中的所谓解耦,就是指在一个软件系统的抽象化和实现化之间使用组合,/,聚合关系,而不是继承关系。,将抽象部分与它的实现部分分离,使它们都可以独立地变化。,这就是桥梁模式的用意。,桥梁模式的结构,抽象化等级,实现化等级,结构与角色,从上类图中可以看出,这个系统含有两个等级结构,也就是:,由抽象化角色和修正抽象化角色组成的抽象化等级结构。,由实现化角色和两个具体实现化角色所组成的实现化等级结构
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 大学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!