设计模式优缺点及应用场景整理

上传人:大米 文档编号:493939892 上传时间:2023-12-05 格式:DOCX 页数:11 大小:26.65KB
返回 下载 相关 举报
设计模式优缺点及应用场景整理_第1页
第1页 / 共11页
设计模式优缺点及应用场景整理_第2页
第2页 / 共11页
设计模式优缺点及应用场景整理_第3页
第3页 / 共11页
设计模式优缺点及应用场景整理_第4页
第4页 / 共11页
设计模式优缺点及应用场景整理_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《设计模式优缺点及应用场景整理》由会员分享,可在线阅读,更多相关《设计模式优缺点及应用场景整理(11页珍藏版)》请在金锄头文库上搜索。

1、看完发现有不太对的地方告诉我下各设计模式优缺点总结1桥接模式优点:1 将实现予以解耦,让它和界面之间不再永久绑定2 抽象和实现可以独立扩展,不会影响到对方3 对于“具体的抽象类”所做的改变,不会影响到客户。缺点:1. 增加了复杂度用途:1. 适合使用在需要跨越多个平台的图形和窗口上2. 当需要用不同的方式改变接口和实现时,你会发现桥接模式很好用 具体实例:跨平台的软件,不同电视机和不同的遥控器。2生成器模式(建造者模式)优点:1. 将一个复杂对象的创建过程封装起来2. 允许对象通过多个步骤来创建,并且可以改变创建过程3. 向客户隐藏内部的表现4. 产品的实现可以被替换,因为客户只看到一个抽象的

2、接口缺点:1. 与工厂模式相比,采用生成器模式创建对象更复杂,其客户,需要更多的知识领域。用处: 用来创建组合结构。典型例子:想不起典型例子 还是扯那个画小人,构建小人分画头,画身体,画双手,黄双脚等不同构建部分,全部 放在一起构建。3 职责链模式优点:1. 将请求的发送者和接收者解耦2. 可以简化你的对象,因为它不需要知道链的结构3. 通过改变链内的成员或调动他们的次序,允许你动态地新增或删除责任 缺点:1. 并不保证请求一定会被执行,如果没有任何对象处理它的话,它可能会落到链尾端 之外2. 可能不容观察运行时的特征,有碍于除错。 用途:经常被使用在窗口系统中,处理鼠标和键盘之类的事件。 当

3、算法牵涉到一种链型运算,而且不希望处理过程中有过多的循环和条件选择语句,并 且希望比较容易的扩充文法,可以采用职责链模式。1)有多个对象处理请求,到底怎么处理在运行时确定。2)希望在不明确指定接收者的情况下,向多个对象中的一个提交请求。3)可处理一个请求的对象集合应该被动态指定。典型例子:一个请求发送给前台,前台表示我无权管理,将请求传递给财务部门,财务部门再4 蝇量模式(享元)优点:1. 减少运行时对象实例的个数,节省内存2. 将许多“虚拟”对象的状态集中管理缺点: 一旦你实现了它,单个的逻辑实现将无法拥有独立而不同的行为用途: 当一个类有许多的实例,而这些实例能被同一方法控制的时候,我们就

4、可以使用蝇量模 式。(这话什么意思啊, HF 书上原话,是这话有问题还是我理解能力有问题?!) 具体场景:五子棋中的黑白子,改变坐标状态(x,y),但用同一个实体。5解释器模式(这个模式我真没仔细看)优点:1 将每一个语法规则表示成一个类,方便事先语言。2 因为语法由许多类表示,所以你可以轻易地改变或扩展此语言 3通过在类结构中加入新的方法,可以在解释的同时增加新的行为,例如打印格式的 梅花或者进行复制的程序验证。缺点:当语法规则数目太大时,这个模式可能会变得非常繁琐。用途:1 当你需要实现一个简答的语言时,使用解释器2 当你有一个简单的语法,切简单比效率更重要时,使用解释器3 可以处理脚本语

5、言和编程语言 典型例子:正则表达式6 中介者模式优点:1. 通过将对象彼此解耦,可以增加对象的复用性2. 通过将控制逻辑集中,可以简化系统维护3. 可以让对象之间传递的消息变得简单而且大幅减少缺点:1. 如果设计不当,中介者对象本身会变得过于复杂用途:常常被用来协调相关的GUI组件(HF设计模式上的原话,这书附录A部分真的有点敷衍) 经典例子:我租房,但没有户主信息,我和户主不能直接交替。没关系,中介者类有我和户主的信 息, private 我, private 户主。而我和户主都认识中介者。我将信息传递给中介者,在我中 调用中介者.获取信息()方法,中介者获取信息后,再由中介者传递给户主。7

6、 备忘录模式优点:1. 将被存储的状态放在外面,不要和关键对象混在一起,可以帮助维护内聚2. 保持关键对象的数据封装3. 提供了容易实现的恢复能力 缺点:1. 储存和恢复状态的过程可能相当耗时用途备忘录模式用于存储状态,在 java 中可以使用序列化。经典例子:游戏中途保存游戏,这时候可以调用保存当前状态方法,再读取的时候调用读取oJava 序列化机制在这方面非常的方便。8 原型模式优点:1. 向客户隐藏制造新实例的复杂性2. 提供让客户能够产生未知类型对象的选项3. 在某些环境下,复制对象比新建对象更有效缺点:复制对象有时相当复杂用途:在一个复制的类层次中,当系统必须从其中的许多类型创建新对

7、象时,可以考虑原型模 式。经典例子:随便拿一个类,给这个类写一个克隆方法,复制当前对象。或者直接用反序列化。9 访问者模式优点:1. 允许你对组合结构加入新的操作,无需改变结构本身2. 想要加入新的操作相对容易3. 访问者所进行的操作,其代码是集中在一起的 缺点:1. 会打破组合类的封装2. 因为游走的功能牵涉其中,随意对组合结构的改变就更加困难。 用途:有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式就是比较合适的, 因为访问者模式使得算法操作的增加变得容易。经典场景:特么访问者模式和翻译器模式,一个看不懂,一个怎么也不想看,到时候要是让 我说这两个模式,我就自认倒霉。10 简单

8、工厂模式优点: 工厂类是整个模式的关键.包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该 创建哪个具体类的对象.通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱 出来,仅仅需要负责“消费”对象就可以了。而不必管这些对象究竟如何创建及如何组织的明 确了各自的职责和权利,有利于整个软件体系结构的优化。缺点: 由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑 集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就 需要改变工厂类了。当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实 例的需求这种对条件的

9、判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓 延,对系统的维护和扩展非常不利;用途:工厂类负责创建的对象比较少; 客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心; 由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用。经典例子:没啥好说的,这不是一个真正的设计模式11 策略模式优点:1. 提供了一种替代继承的方法,而且保持了继承的优点,比继承更独立(算法独立,可 以任意扩展)2. 避免程序使用多重条件转移语句,使系统更灵活,并易于扩展3. 遵守大部分常用设计原则,高内聚,低耦合缺点:1. 每个具体策略类都会产生一个新类,所以会增加系统需要维护的类的

10、数量。可以使 用工厂方法来解决。各个不同地区不同的纳税方法,HF中不同鸭子的方法。有多种鸭子,每个鸭子都有自 己的行为, fly, quaak 之类的。行为有行为类,继承同一接口实现不同操作,以此实现算法 互换。12 装饰模式优点:1. 装饰模式与继承关系的目的都是要扩展对象的功能,但是装饰模式可以提供比继承 更多的灵活性。2. 通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不 同行为的组合。3. 有着比继承更加灵活的特性缺点:由于使用装饰模式,可以比使用继承关系需要较少数目的类。使用较少的类,当然使设 计比较易于进行。但是,在另一方面,使用装饰模式会产生比使用继承关系

11、更多的对象。更 多的对象会使得查错变得困难,特别是这些对象看上去都很相像。用途:当需要给一个类添加新的行为的时候,但基于开闭原则,就使用装饰模式。经典例子:我穿衣服使用draw ()方法,在我穿好衣服后,我还打算再寄领带,而寄领带就是装 饰类,我们可以把装饰类和对象(穿衣服类)继承于同一个接口,在装饰类的draw ()方 法中调用super.draw (),然后再在这个方法里加上自己的特征。13 代理模式优点: 向客户端隐藏了访问某个对象的细节及复杂性;可以动态地调用一个对象中的方法,且 无需实现固定的接口。缺点:(个人见解切勿当真)总觉得代理者不够可靠,不能得到有效的保证,要是对象代理 者在

12、维护的时候,或者其他的做出了变动,对被代理的人来说可能带来损失。使用场景:1. 远程代理,可以隐藏一个对象存在于不同地址空间的事实2. 虚拟代理,比如 html 页面刷新的图片,图片一张嘴下载后才能看就是通过虚拟代 理来替代了真实的图片,此时代理存储了真实图片的路径和尺寸3. 安全代理,用来控制真实对象的访问权限。一般用于对象应该有不同的访问权限的 时候4. 智能指引,当调用真实的对象时,代理处理另外一些事。经典例子:我玩wow,但又没有时间精力投入到里面,于是我请了个人来代练,代练的人和我都继承于玩家类。而代练者是认识我的,当代练的人开始刷副本的时候,调用代练者.刷副本 ()方法,此时他在这

13、个方法中实际调用的是我.刷副本( 。14工厂方法模式优点:1. 良好的封装性,代码结构清晰。一个对象创建是有条件约束的,如一个调用者需要 一个具体的产品对象,只要知道这个产品的类名(或约束字符串)就可以了,不用 知道创建对象的艰辛过程,减少模块间的耦合。2. 工厂方法模式的扩展性非常优秀。在增加产品类的情况下,只要适当地修改具体的 工厂类或扩展一个工厂类,就可以完成“拥抱变化”。例如在我们的例子中,需要 增加一个棕色人种,则只需要增加一个BrownHuman类,工厂类不用任何修改就可 完成系统扩展。3. 屏蔽产品类。这一特点非常重要,产品类的实现如何变化,调用者都不需要关心, 它只需要关心产品

14、的接口,只要接口保持不表,系统中的上层模块就不要发生变化, 因为产品类的实例化工作是由工厂类负责,一个产品对象具体由哪一个产品生成是 由工厂类决定的。在数据库开发中,大家应该能够深刻体会到工厂方法模式的好处: 如果使用JDBC连接数据库,数据库从MySql切换到Oracle,需要改动地方就是切 换一下驱动名称(前提条件是 SQL 语句是标准语句),其他的都不需要修改,这是 工厂方法模式灵活性的一个直接案例。4. 工厂方法模式是典型的解耦框架。高层模块值需要知道产品的抽象类,其他的实现 类都不用关心,符合迪米特原则,我不需要的就不要去交流;也符合依赖倒转原则, 只依赖产品类的抽象;当然也符合里氏

15、替换原则,使用产品子类替换产品父类,没 问题!缺点:待补充用途:第一种情况是对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂, 生产出具体的产品来。Java Collection中的iterator。方法即属于这种情况。第二种情况,只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选 用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使 用者,而这个决策过程这对于使用者来说是透明的。典型例子:车子继承vehicle (车)类,有小汽车卡,公交车bus等,车子工厂实现工厂接口,工厂接口有 抽象方法vehicle produce vehicle (String type)方法,车子工厂中实现工厂方法vehicle produce vehicle(String Type),方法中根据需要new新的车子。15 模板方法模式优点: 模板方法模式通过把不变的行为搬移到超类,去除子类中的重复代码来体现它的优势 模板方法模式提供了一个很好的代码复用平台。 缺点:没啥明显缺点吧?简单实用的设计模式。当不变的和可变的行为在方法的子类实现中混合在一

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号