认证主体:宁夏凯米世纪网络科技有限公司
IP属地:宁夏
统一社会信用代码/组织机构代码
91640100MA774ECW4K
2、。创建模式:简单工厂、工厂方法、抽象工厂、单例、建造、模型;结构模式:适配器、缺省适配、合成、装饰、代理、享元、门面、桥梁;行为模式:不变、策略、模板方法、观察者、迭代子、责任链、命令备忘录、状态、访问者、解释器、调停者。(最后三种不讲)工厂方法模式是类的创建模式,又叫虚拟构造子(virtualconstructor)模式或者多态性工厂(polymorphicfactory)模式。工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际工作推迟到子类中。工厂方法解决问题:工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了
3、它的缺点。工厂方法缩略图该模式的优点:这种抽象的结果,使这种工厂方法模式可以用来允许系统不修改具体工厂角色的情况下引进新产品,这一特点无疑使得工厂模式具有超过简单工厂模式的优越性。在工厂方法模式中,一般都有一个平行的等级结构,也就是说工厂和产品是对应的的。抽象工厂对应抽象产品,具体工厂对应具体产品。简单的示意图如下:各种角色分类抽象工厂角色:具体工厂角色:抽象产品角色:具体产品角色:72、简单工厂模式主讲人:陈儒组员:韩政高、戴鹏军、陈群1页页8简单的介绍简单工厂模式是创建型模式,用于对象的创建,它不属于23种gof设计模式。它是工厂模式家族中最简单实用的模式,可以理解为是不同工厂
4、模式的一个特殊实现。设计模式描述了软件设计过程中某一类常见问题的一般性的解决方案,是解决某个方向上的变动需求的问题。而工厂设计模式的存在是为了解决哪一方面的问题呢?或者说它的动机是什么呢?9动机在软件系统中,经常面临着“某个对象”的创建工作;由于需求的变化,这个对象经常面临着剧烈的变化,但是它却拥有比较稳定的接口。如何应对这种变化?如何提供一种“封装机制”来隔离出“这个易变对象”的变化,从而保持系统中“其他依赖该对象的对象”不随着需求改变而改变?10优缺点优点:简单工厂模式主要用于隔离类对象的使用者和具体类型之间的耦合关系。面对一个经常变化的具体类型,紧耦合关系会导致软件的脆弱。通过使用工
5、厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了。而不必管这些对象究竟如何创建及如何组织的明确了各自的职责和权利,有利于整个软件体系结构的优化。缺点:由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。3、抽象工厂模式by:缪丹权柳敏乾李青振2页页factory追mm少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是mm爱吃的东西,虽然口味有所不同,但不管你带mm去麦当劳或肯德基,只管向服务员说来四个鸡翅就行了。麦当劳和肯德
8、ava类来实现,而所有的具体工厂类必须实现该接口或者继承抽象类。具体工厂类(conretefactory)角色:这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑。通常使用具体类来实现这个角色。抽象产品(abstractproduct)角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。通常使用接口或者抽象类来实现这一角色。具体产品(concreteproduct)角色:抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。通常使用具体java类来实现。抽象工厂模式时序图在客户新建一个抽象工厂的时候,其实是新建了一个
9、具体的工厂,然后再通过该具体工厂来创建各种具体的产品。抽象工厂模式优缺点优点:s程序设计中有三种耦合:零耦合、抽象耦合、具体耦合。抽象工厂设计可以很好的把具体耦合转换到抽象耦合来减少耦合程度。s具体产品从客户代码中被分离出来。s容易改变产品的系列。s将一个系列的产品族统一到一起创建。抽象工厂模式优缺点缺点:u由于每个类的产生都要继承抽象类(或接口),并由工厂来创建,这样就增加了代码长度和工作量。u在产品族中扩展新的产品是很困难的,它需要修改抽象工厂的接口。u使软件结构更复杂。与其他模式的区别和联系与工厂模式的区别:工厂方法模式是一种极端情况的抽象工厂模式,而抽象工厂模式可以看成是工厂方
11、gletonpattern(单例模式)(单例模式)1页页singleton俺有6个漂亮的老婆,她们的老公都是我,我就是我们家里的老公sigleton,她们只要说道老公,都是指的同一个人,那就是我(刚才做了个梦啦,哪有这么好的事)单例模式:单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例单例模式。单例模式只应在有真正的单一实例的需求时才可使用。什么是单例模式顾名思义,单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。单例模式的要点(1)某个类只能有一个实例;(2)它必须自行创建这个实例;(3
12、)它必须自行向整个系统提供这个实例。解决方案-单例模式意图:希望类只有一个实例,但没有控制类实例化的全局变量(对象)。同时希望确保所有客体对象使用该类的相同实例,而无需将引用传给它们。问题:几个不同的客户对象需要引用同一个对象,而且希望确保这种类型的对象数目不超过一个。解决方案:保证一个实例参与者与协作者:客户对象只能通过getinstance()方法创建单例类的实例。效果:客户对象无需操心是否存在单例类的实例,实例化有单例类自己控制。实现:一个引用单例对象的静态私有成员变量一个公共静态方法,负责实现一次性的实例化并返回对单例对象的引用设置为保护或私有的构造方法单例模式的关键特征单例模式设计会
13、产生什么问题?在多线程程序中,singleton模式可能会出现一个问题。假设对getinstance()方法的两个调用几乎同时发生,这种情况可能非常糟糕。此时会发生什么?1.第一个线程检查实例是否存在。因为实例不存在,该线程执行创建第一个实例的代码部分。2.然而,假设在实例化完成之前,另一个线程也来检查实例成员变量是否为null。因为第一个线程还什么都没有创建,实例成员变量仍然等于null,所以第二个线程也执行了创建一个对象的代码。3.现在,两个线程都执行了singleton对象的new操作,因此创建了两个重复的对象。懒汉式vs饿汉式所以,到底使用哪一种方式,要看实际的需求。n饿汉式:静
15、这是单例模式需要解决的同步问题。参与者:singleton定义一个instance操作,允许客户访问它的唯一实例,instance是一个类操作,负责创建自己的唯一实例。协作关系:客户只能通过singleton的instance操作访问一个singleton的实例。主讲:范允易小组成员:陈巧燕、刘秀颖、郭娟5、建造者模式(builderpattern)-创建型模式1页页buildermm最爱听的就是我爱你这句话了,见到不同地方的mm,要能够用她们的方言跟她说这句话哦,我有一个多种语言翻译机,上面每种语言都有一个按键,见到mm我只要按对应的键,它就能够用相应的语言说出我爱你这句话了,国外的mm
16、也可以轻松搞掂,这就是我的我爱你builder。(这一定比美军在伊拉克用的翻译机好卖)建造模式:将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。概述概述builder模式是一种创建型模式,它主要是应对项目中一些复杂对象的创建工作。所谓“复杂对象”是指:此对象中还含有其它的子对象。意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。-设计模式gofbuilder模式结构l建造者(builder)角色l具体
18、化的部分和相对稳定的部分,隔离变化,解耦稳定的组装过程和变化的具体部件,使得我们不用去关心每个部件是如何组装的;如何将具体部件和组装算法隔离是要解决的问题。什么是原始模型模式?什么是原始模型模式?属于对象的创建模式。通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象。结构:结构:第一种是简单形式第一种是简单形式第二种是登记形式第二种是登记形式6、原始模型模式小组分工:做报告:郑迟回答问题:徐冰,俞栋辉代码:王炜2页页prototype跟mm用qq聊天,一定要说些深情的话语了,我搜集了好多肉麻的情话,需要时只要copy出来放到qq里面就行了,这就是
19、我的情话prototype了。(100块钱一份,你要不要)原始模型模式:通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方法创建出更多同类型的对象。原始模型模式允许动态的增加或减少产品类,产品类不需要非得有任何事先确定的等级结构,原始模型模式适用于任何的等级结构。缺点是每一个类都必须配备一个克隆方法。简单形式这种形式涉及到三个角色:这种形式涉及到三个角色:客户(client)角色:客户类提出创建对象的请求。抽象原始(prototype)角色:这是一个抽象角色,通常由一个java接口或java抽象类实现。此角色给出所有的具体原始类所需要的接口。具体原型(concrete
20、prototype)角色:被复制的对象。此角色需要实现抽象的原型角色所要求的接口。简单形式uml图登记形式这种形式涉及到三个角色:这种形式涉及到三个角色:客户端(client)角色:客户端类向管理员提出创建对象的请求。抽象原型(prototype)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体原型类所需要的接口。具体原型(concreteprototype)角色:被复制的对象。需要实现抽象原型角色所要求的接口。原型管理器(prototypemanager)角色:创建具体原型类的对象,并记录每一个被创建的对象。登记形式uml图两种形式的比较简单形式
21、和登记形式的原始模型模式各有其长处和短处。1)如果需要创建的原型对象数目较少而且比较固定的话,可以采取第一种形式,也即简单形式的原始模型模式。在这种情况下,原型对象的引用可以由客户端自己保存。2)如果要创建的原型对象数目不固定的话,可以采取第二种形式,也即登记形式的原始模型模式。在这种情况下,客户端并不保存对原型对象的引用,这个任务被交给管理员对象。在复制一个原型对象之前,客户端可以查看管理员对象是否已经有一个满足要求的原型对象。如果有,可以直接从管理员类取得这个对象引用;如果没有,客户端就需要自行复制此原型对象。模式的实现1):浅复制(浅克隆)被复制对象的所有变量都含有与原来的对象相同的值
22、,而所有的对其他对象的引用都仍然指向原来的对象,换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。2):深复制(深克隆)被复制对象的所有的变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍,而这种对被引用到的对象的复制叫做间接复制。模式的实现利用串行化来作深复制把对象写到流里的过程是串行化(serilization)过程,非常形象的称为“冷冻”或是“腌咸菜”过程。而把对象从流中读出来的并行化(deserialization)过程叫做“解冻”或是
23、“回鲜”过程。写到流里的是对象的一个拷贝,而原来对象仍然存在于jvm里面,因此“腌成咸菜”(串行化)的只是对象的一个拷贝。java咸菜(并行化)还可以回鲜。模式的实现串行化的结构图浅复制uml图深复制uml图原始模型模式的优缺点特有的优点(1):原始模型模式原许动态地增加或减少产品类。由于创建产品类实例的方法是产品类内部具有的,因此,增加新产品对整个结构没有影响。(2):原始模型模式提供简化的创建结构。工厂方法模式常常需要有一个与产品类等级结构相同的等级结构,而原始模型模式就不需要这样。(3):具有给一个应用软件动态加载新功能的能力。例如,一个分析web服务器的记录文件的应用软件,针对每
24、一种记录文件格式,都可以由一个相应的“格式类”负责。如果出现了应用软件所不支持的新的web服务器,只需要提供一个格式类的克隆,并在客户端登记即可,而不必给每个软件的用户提供一个全新的软件包。(4):产品类不需要非得有任何事先确定的等级结构,因为原始模型模式适合用于任何的等级结构。主要缺点:每一个类都必须配备一个克隆方法,配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类来说不是很难,而对于已经有的类不一定很容易,特别是当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候。7、theadaptorpattern(适配器模式)主讲:顾祝燕组员:耿惠、何振芬、朱金凤2页页adapt
25、er在朋友聚会上碰到了一个美女sarah,从香港来的,可我不会说粤语,她不会说普通话,只好求助于我的朋友kent了,他作为我和sarah之间的adapter,让我和sarah可以相互交谈了(也不知道他会不会耍我)适配器(变压器)模式:把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口原因不匹配而无法一起工作的两个类能够一起工作。适配类可以根据参数返还一个合适的实例给客户端。面向对象软件系统的适配问题假设我们已经有一个软件系统,原来使用了一个第三方类库a。现在有一个新的第三方类库b,其功能等各方面都更加强大。我们希望用b来替换a,以改善我们的系统。但是b的接口与a不一样。那怎么办呢
28、于类的adapter模式基于类的adapter模式的一般结构如下:adaptee类为adapter的父类,adaptee类为适配源,适配目标(接口)也是adapter的父类;基于类的adapter模式比较适合应用于adapter想修改adaptee的部分方法的情况。基于对象的adapter模式基于对象的adapter模式的一般结构如下:adaptee类对象为adapter所依赖,适配目标(接口)是adapter的父类;基于对象的adapter模式比较适合应用于adapter想为adaptee添加新的方法的情况。但在adaptee类的方法与adapter类的方法不同名而实现相同功能的情况
30、个请求。效果(类适配器和对象适配器有不同的权衡)类适配器用一个具体的adapter类对adaptee和target进行匹配。结果是当我们想要匹配一个类以及所有它的子类时,类adapter将不能胜任工作。使得adapter可以重定义adaptee的部分行为,因为adapter是adaptee的一个子类。仅仅引入了一个对象,并不需要额外的指针以间接得到adaptee。adapter模式效果(类适配器和对象适配器有不同的权衡)对象适配器则允许一个adapter与多个ada
31、ptee即adaptee本身以及它的所有子类(如果有子类的话)同时工作。adapter也可以一次给所有的adaptee添加功能。使得重定义adaptee的行为比较困难。这就需要生成adaptee的子类并且使得adapter引用这个子类而不是引用adaptee本身。8、缺省适配模式(defaultadapter)-杨鹏、余晖、许超杰1页页问题的提出:鲁智深的故事这个抽象的天星类便是一个适配器类,鲁智深实际借助于适配器类模式达到了剃度的目的。此适配器类实现了和尚接口所要求的所有方法。但是与通常的适配器
32、模式不同的是,此适配器类给出所有的方法的实现都是“平庸”的。这种“平庸化”的适配器模式称作缺省适配模式缺省适配模式缺省适配模式(defaultadapter)一、概述缺省适配模式为一个接口提供缺省实现,这样子类型可以从这个缺省实现进行扩展,而不必从原有接口进行扩展。当不需要全部实现适配器接口提供的方法时,可先设计一个抽象类实现适配器接口,并为接口中每个方法提供一个默认实现(空方法)。那么该抽象类的子类可有选择地覆盖父类的某些方法来实现需求。二、结构二、结构缺省适配模式(defaultadapter)publicinterfaceabstractservicevoidservic
33、eoperation1();intserviceoperation2();stringserviceoperation3();publicclassserviceadapterimplementsabstractservicepublicvoidserviceoperation1()publicintserviceoperation2()return0;publicstringserviceoperation3()returnnull;缺省适配模式小结在任何时候,如果不准备实现一个接口的所有方法时,就可以模仿windowapdapter的做法制造一个抽
34、象类,给出所有方法的平庸的实现。这样从这个抽象类继承下去的子类就不必实现所有的方法了。适配器模式把一个类的接口换成客户端所期待的另一个接口。缺省适配模式-适配器模式的“平庸化”形式可以使所考察的类不必实现不需要的那部分接口。99、composite(composite(合成合成))模式模式讲解人:陈敖其他成员:黄文,林丽丽,林温柔2页页compositemary今天过生日。我过生日,你要送我一件礼物。嗯,好吧,去商店,你自己挑。这件t恤挺漂亮,买,这条裙子好看,买,这个包也不错,买。喂,买了三件了呀,我只答应送一件礼物的哦。什么呀,t恤加裙子加包包,正好配成一套呀,小姐,麻烦你包起来。.
36、emove()等.composite模式中对象的管理有两种方案。安全方式:此方式只允许树枝构件有对象的管理方法。透明方式:此方式只允许树枝和树叶都有对象的管理方法,但树叶对象中的管理方法无实际意义。组成部分:component构件:抽象组合对象的公共行为接口leaf构件:树叶对象,没有下级子对象composite构件:树枝对象,树枝对象可以包含一个或多个其他树枝或树叶对象uml示意图:安全方式:透明方式:安全式特点:错误地调用会导致编译时出错透明式特点:编译时不会出错,错误地调用会导致抛出异常优点:可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,使得增加新构件也更容易
37、。客户端调用简单,客户端可以一致的使用组合结构或其中单个对象。定义了包含叶子对象和容器对象的类层次结构,叶子对象可以被组合成更复杂的容器对象,而这个容器对象又可以被组合,这样不断递归下去,可以形成复杂的树形结构。很容易在组合体内加入对象构件,客户端不必因为加入了新的对象构件而更改原有代码。缺点:设计变得更加抽象,对象的业务规则如果很复杂,则实现组合模式具有很大挑战性,而且不是所有的方法都与叶子对象子类都有关联。增加新构件时可能会产生一些问题,很难对容器中的构件类型进行限制。适用环境:需要表示一个对象整体或部分层次,在具有整体和部分的层次结构中,希望通过一种方式忽略整体与部分的差异
38、,可以一致地对待它们。让客户能够忽略不同对象层次的变化,客户端可以针对抽象构件编程,无需关心对象层次结构的细节。对象的结构是动态的并且复杂程度不一样,但客户需要一致地处理它们。10、装饰模式、装饰模式presentedby马庆沈月云彭怡然姚敏2页页decoratormary过完轮到sarly过生日,还是不要叫她自己挑了,不然这个月伙食费肯定玩完,拿出我去年在华山顶上照的照片,在背面写上最好的的礼物,就是爱你的fita,再到街上礼品店买了个像框(卖礼品的mm也很漂亮哦),再找隔壁搞美术设计的mike设计了一个漂亮的盒子装起来.,我们都是decorator,最终都在修饰我这个人呀,怎
39、么样,看懂了吗?装饰模式:装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,提供比继承更多的灵活性。动态给一个对象增加功能,这些功能可以再动态的撤消。增加由一些基本功能的排列组合而产生的非常大量的功能。1.装饰模式介绍意图意图动态地给一个对动态地给一个对象添加一些额外象添加一些额外的职责。就增加的职责。就增加功能来说,功能来说,decorator模式模式比生成子类更为比生成子类更为灵活灵活decorator模式模式工作原理工作原理可以创建始于可以创建始于decorator对象(负对象(负责新功能的对象)责新功能的对象)终于原对象的一个终于原对象的一个对象对象“链链”1.
40、装饰模式介绍装饰模式的定义装饰模式可以动态的给一个对象附加一些功能。使用装饰模式扩展功能不会产生类爆炸。它采用的是合成方式,比继承方式更加灵活。装饰模式要解决的问题提供一种修改类的行为,而避免创建众多的派生类的途径。3.讨论v面向对象设计的开面向对象设计的开-闭原则闭原则v类应该对扩展开放,对修改封闭。类应该对扩展开放,对修改封闭。目的是在不需修改已有代码的情况下方便的扩展类的功能。按照这一原则设计的系统具有以下优点:具有一定的适应性和灵活性。具有一定的稳定性和延续性。v“对扩展开放,对修改封闭。对扩展开放,对修改封闭。”这听起来自这听起来自相矛盾啊!有哪些方法可以不修改已有代码相
41、矛盾啊!有哪些方法可以不修改已有代码但又能扩展其功能?但又能扩展其功能?v何时使用开闭原则?何时使用开闭原则?3.讨论v何谓装饰?如何装饰?何谓装饰?如何装饰?所谓装饰就是将一个对象包装起来。所谓装饰就是将一个对象包装起来。在程序上也就是让一个对象在程序上也就是让一个对象a包含另一个对包含另一个对象象b。a对应的类对应的类a是是“装饰类装饰类”,b对应的类对应的类b是是被装饰类。被装饰类。如果要让装饰可以重复,且不必考虑次序,如果要让装饰可以重复,且不必考虑次序,那么装饰的要点是装饰者和被装饰者具有那么装饰的要点是装饰者和被装饰者具有相相同的类型同的类型(有共同的父类)。(有共同的父类)。3
42、.讨论首先生成一个首先生成一个darkroast对象对象darkroastcost()darkroast继承了beverage,拥有一个计算饮料价格的方法cost()。3.讨论mochacost()然后然后darkroastcost()mocha对象是装饰者,他与被它装饰的对象darkroast具有相同的类型(是beverage的子类),也有一个cost()方法。顾客想要mocha,所以我们创建一个mocha对象,并用它包装darkroast.3.讨论再然后再然后mochacost()darkroastcost()whip对象是装饰者,他与被它装饰的对象darkroast具有相同的类型,也有一
43、个cost()方法。顾客还想要whip,所以我们创建一个whip对象,并用它包装mocha.whipcost()3.讨论计算饮料的价格计算饮料的价格mochacost()darkroastcost()调用最外层的装饰者whip的cost(),whip再将计算任务委派给被它包装的对象,得到一个价格后,再加上whip自己的价格.whipcost()5.005.00+0.505.50+1.006.50diagram所谓委派就是一个对象将工作(或工作的所谓委派就是一个对象将工作(或工作的一步分)交给另一个对象来完成。一步分)交给另一个对象来完成。在装饰模式中,委派是指在装饰模式中,委派是指装饰对象装饰
44、对象将任务将任务交给交给被装饰对象被装饰对象来完成。来完成。委派可以传递,最终必须要有一个委派可以传递,最终必须要有一个干实事干实事的对象的对象。v何谓委派?何谓委派?3.讨论装饰者在委派它装饰的装饰者在委派它装饰的对象作某种处理时,可对象作某种处理时,可以添加上自己的行为以添加上自己的行为(功能扩展)(在委派(功能扩展)(在委派之前或之前或/和之后)。和之后)。装饰者与被装饰者装饰者与被装饰者具有相同的类型具有相同的类型对象可以在任何时候被对象可以在任何时候被装饰,因此我们能在运装饰,因此我们能在运行时动态的装饰对象。行时动态的装饰对象。可以用多个装饰可以用多个装饰者装饰一个对象者装饰一个对
45、象由于装饰者与被装饰者由于装饰者与被装饰者具有相同的类型,我们具有相同的类型,我们可以用装饰后的对象代可以用装饰后的对象代替原来的对象。替原来的对象。要点要点houseblendcost()beveragedescriptiongetdescription()cost()/othermethodsdarkroastcost()decafcost()espressocost()condimentdecoratorgetdescription()mochabeveragebeveragegetdescription()cost()whipbeveragebeveragegetdescrip
46、tion()cost()具体的咖啡品种调味品装饰者,不仅实现cost(),还要实现getdescription()考虑一下本讲开头的引例是如何实现的。咖啡店的类图咖啡店的类图proxypatternproxypattern11、代理模式小组成员:王建奇,王洪军,嵇海锋,吴水生2页页proxy跟mm在网上聊天,一开头总是hi,你好,你从哪儿来呀?你多大了?身高多少呀?这些话,真烦人,写个程序做为我的proxy吧,凡是接收到这些话都设置好了自动的回答,接收到其他的话时再通知我回答,怎么样,酷吧。代理模式:代理模式给某一个对象提供一个代理对象,并由代理对象控制对源对象的引用。代理就是一个人或
47、一个机构代表另一个人或者一个机构采取行动。某些情况下,客户不想或者不能够直接引用一个对象,代理对象可以在客户和目标对象直接起到中介的作用。客户端分辨不出代理主题对象与真实主题对象。代理模式可以并不知道真正的被代理对象,而仅仅持有一个被代理对象的接口,这时候代理对象不能够创建被代理对象,被代理对象必须有系统的其他角色代为创建并传入。代理模式的定义定义代理模式(proxypattern),为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。代理,指的就是一个角色代表另一个角色采取行动,就
50、寸。保护(protectoraccess)代理:控制对一个对象的访问权限。一般用于对象有不同权限的时候。智能引用(smartreference)代理:当调用真实对象时,代理出来另外一些事,提供比对目标对象额外的服务。如:计算真实对象的引用次数,这样当该对象没有引用时,可以自动释放它;或当第一次引用一个持久对象时,将它装入内存;或在访问一个实际对象前,检查是否已经锁定它,以确保其它对象不能改变它。它们都是通过代理在访问一个对象时附加一些内务处理。动机1.为了在我们确实需要这个对象是才对它进行创建和初始化。2.用户希望程序和某个对象打交道,程序不希望用户直接访问该对象为什么要使用为什么
51、要使用proxy模式?模式?代理模式的作用proxy模式在访问对象时引入了一定程度的间接性。根据代理的类型,附加的间接性有多种用途:(1)远程代理可以隐藏一个对象存在于不同地址空间的事实。(2)虚代理可以进行最优化,例如根据要求创建对象。(3)保护代理和智能指针都允许访问一个对象时有一些附加的内务处理。远程代理(remoteproxy)为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。rmi(remotemethodinvocation)是一种分布式技术,使用rmi可以让一个虚拟机上的应用程序请求调用位于网络上另一个jvm上的对象方法。
52、rmi不希望客户应用程序直接与远程对象打交道,代替地让应用程序和远程对象的代理打交道。rmi会生成一个存根:一种特殊的字节码,并让这个存根产生的对象作为远程对象的代理,即远程代理。虚代理代理通常拥有与实际对象基本相同的接口。代理的工作方式是:把服务请求明智地转发给代理控制的底层对象,最终完成任务。对于大数据量的加载,virtualproxy模式可以让加载在后台进行,前台用的prxoy对象使得整体运行速度加快。虚代理例子在文档中嵌入图形对象的文档编辑器,有些图形对象的创建开销很大。但是打开文档必须很迅速,因此我们在打开文档时避免一次性创建所有开销很大的对象。意味着应该根据需要进行创建,我们
53、使用一个图像代理,替代那个真的图像,能够实现这个需求。保护代理控制对一个对象的访问权限。一般用于不同客户对对象拥有不同访问权限的时候。结构上,保护代理和远程代理以及虚代理是极为相似的,只是在请求访问真实对象时提供的功能不同。区别:远程代理向客户隐藏了远端机器或进程上的对象,虚代理负责管理了真实对象的加载方式。而保护代理则为用户访问对象的权限进行管理12、享元模式王萌(讲课)黄万德(ppt、代码)王勋(回答问题)1页页flyweight每天跟mm发短信,手指都累死了,最近买了个新手机,可以把一些常用的句子存在手机里,要用的时候,直接拿出来,在前面加上mm的名字就可以发送了,再不用一个字一
54、个字敲了。共享的句子就是flyweight,mm的名字就是提取出来的外部特征,根据上下文情况使用。享元模式:flyweight在拳击比赛中指最轻量级。享元模式以共享的方式高效的支持大量的细粒度对象。享元模式能做到共享的关键是区分内蕴状态和外蕴状态。内蕴状态存储在享元内部,不会随环境的改变而有所不同。外蕴状态是随环境的改变而改变的。外蕴状态不能影响内蕴状态,它们是相互独立的。将可以共享的状态和不可以共享的状态从常规类中区分开来,将不可以共享的状态从类里剔除出去。客户端不可以直接创建被共享的对象,而应当使用一个工厂对象负责创建被共享的对象。享元模式大幅度的降低内存中对象的数量。享元模式运用共享技
55、术共享技术有效地支持大量细粒度的对象模式结构中的四种角色1.享元接口(flyweight)2.具体享元(concreteflyweight)3.享元工厂(flyweightfactory)4.客户端(client)类图享元模式的特点享元模式的特点享元模式的意图是通过共享有效支持大量细粒度的对象,来提供应用程序的性能,节省系统中重复创建对象实例的性能消耗这个怎么理解呢?1、当我们系统中某个对象类型的实例较多的情况。2、并且要求这些实例进行分类后,发现真正有区别的分类很少的情况。享元模式的使用场景享元模式的使用场景1、当我们发现某个类型的对象有大量的实例时,我们是否可以对
56、这些实例进行分类,经过分类后,我们发现只有很少的类别的情况下。2、我们发现通过使用享元模式后能够提高系统的性能和不会带来更多的复杂度时。享元模式的优点使用享元可以节省内存的开销,特别适合处理大量细粒度对象,这些对象的许多属性值是相同的,而且一旦创建则不容许修改享元模式中的享元可以使用方法的参数接受外部状态中的数据,但外部状态数据不会干扰到享元中的内部数据,这就使得享元可以在不同的环境中被共享13、faade(门面)模式主讲:汪庆锋组员:沈仙桥、阮金晶、毛泉涌2页页facade我有一个专业的nikon相机,我就喜欢自己手动调光圈、快门,这样照出来的照片才专业,但mm可不懂这些,教了半天也不
57、会。幸好相机有facade设计模式,把相机调整到自动档,只要对准目标按快门就行了,一切由相机自动调整,这样mm也可以用这个相机给我拍张照片了。门面模式:外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。每一个子系统只有一个门面类,而且此门面类只有一个实例,也就是说它是一个单例模式。但整个系统可以有多个门面类。4.facade模式登场定义:将子系统中的各类(或结构与方法)整合成一个简明一致的界面,隐藏子系统的复杂性,使子系统更加容易使用。4.facade模式登场(续)简单结构图facadeclient2client1client3sub
58、system4.facade模式登场(续)模式实现定义一个(或多个)具备所需接口的新类(门面类)新类(门面类)使用原有的系统客户使用门面类对象与原系统打交道6.模式剖析结合前面的facade模式结构图来分析周星星看病这个实际例子:图中的subsystem对应了挂号、划价、缴费、取药这些操作集合;facade对应了接待员receptionist对象;然后client对应了病人周星星。6.模式剖析(续)接待员receptionist对象将子系统中的多个接口重新封装成一个更高层、更简单的接口供client使用,将子系统的复杂性隐藏起来,将子系统与client的联系解耦。用户不必关心子系统
59、的运作方式,只需和facade也即receptionist对象打交道,完成自己所需的工序。7.模式优点它对客户屏蔽子系统组件,因而减少了客户处理的对象的数目并使得子系统使用起来更加方便。它实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件往往是紧耦合的。如果应用需要,它并不限制用户使用子系统类,因此你可以在系统易用性和通用性之间加以选择。8.模式适用场合当你要为一个复杂子系统提供一个简单接口时。客户只需要使用某个复杂系统的子集,或者需要以一种特殊的方式与系统交互。希望封装或者隐藏原系统时。9.迪米特法则只与你直接的朋友们通信。迪米特法则要求一个对象的相互作用是短程的,朋