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

上传人:lis****211 文档编号:130114079 上传时间:2022-08-04 格式:DOCX 页数:11 大小:27.03KB
收藏 版权申诉 举报 下载
设计模式优缺点及应用场景整理_第1页
第1页 / 共11页
设计模式优缺点及应用场景整理_第2页
第2页 / 共11页
设计模式优缺点及应用场景整理_第3页
第3页 / 共11页
资源描述:

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

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

2、工厂模式相比,采用生成器模式创建对象更复杂,其客户,需要更多的知识领域。 用处:用来创建组合结构。典型例子:想不起典型例子还是扯那个画小人,构建小人分画头,画身体,画双手,黄双脚等不同构建部分,全部 放在一起构建。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备忘录模式优点:1. 将被存储的

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

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

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

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

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

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

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

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

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

15、第一种情况是对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂, 生产出具体的产品来。Java Collection中的iterator()方法即属于这种情况。第二种情况,只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选 用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使 用者,而这个决策过程这对于使用者来说是透明的。典型例子:车子继承vehicle (车)类,有小汽车卡,公交车bus等,车子工厂实现工厂接口,工厂接口有 抽彖方法vehicle produce vehicle (String type)方法,车

16、子工厂中实现工厂方法vehicle produce vehicle (String Type),方法中根据需要new新的车子。15模板方法模式优点:模板方法模式通过把不变的行为搬移到超类,去除子类中的重复代码来体现它的优势。 模板方法模式提供了一个很好的代码复用平台。缺点:没啥明显缺点吧?简单实用的设计模式。当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为会在子类中 重复出现,我们可以通过模板方法牧师把这些行为搬移到单一的地方(方法)中,这样就帮 助子类摆脱重复的不变行为的纠缠。典型例子:泡茶和泡咖啡两个动作很像,都有煮开水()方法,放入茶或咖啡()方法,把泡好的 导入被子,

17、加调料,这四个动作在一起算是完成泡咖啡行为。在这里,我们可以把泡茶和泡 咖啡都继承于抽彖类饮料中,而饮料类有个模板方法,templateMethod ()这个方法封装其 他几个行为方法。而客户端想执行那几个方法的时候,只需要调用emplateMethod ()模板 方法。我们会把templateMethod ()方法用final修饰,以免这个算法骨架被重写而改变。16外观模式优点:1. 对客户屏蔽了其子系统组件,因而减少了客户处理对彖的数目,并使得子系统实用 起来更方便2. 它实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件往往是紧耦合 的。松耦合关系使得子系统的组件变化不会影响到它

18、的客户。Facade模式有助于 建立层次结构系统,也有助于对对彖之间的依赖关系分层。Facade模式还可以消 除复杂的循坏依赖关系,这一点在客户程序与子系统是分别实现的时候尤为重要。3. 如果应用需要,它并不限制它们实用子系统类。因此你可以在系统易用性和通用性 之间进行选择。缺点:限制了客户的自由,减少了可变性。用途:a) 为一个复杂子系统提供一个简单接I I.b) 提高子系统的独立性.c) 在层次化结构中,可以使用Facade模式定义系统中每一层的入I。典型例子魔兽插件一键换装,会同时调用更换掉身上的装备接I I和更换角色天赋的接I I。17观察者模式优点:1. 观察者和被观察者之间是松耦合

19、的,分别可以各自独立改变。2. Subject在发送广播通知的时候,无须指定具体的0bserver, Observer可以自己决定 是否要订阅Subject的通知。3. 遵守大部分GRASP原则和常用设计原则,高内聚、低耦合。缺点:1. 松耦合导致代码关系不明显,有时可能难以理解。2. 如果一个对象被人量观察者订阅的话,在广播通知的时候可能会有效率问题。(毕 竟只是简单的遍历)使用场景1、对一个对彖状态的更新,需要其他对象同步更新,而且其他对彖的数量动态可变。2、对彖仅需要将自己的更新通知给其他对彖而不需要知道其他对象的细节。 经典例子:看电视,天气预报看新闻联播,观众们是观察者,新闻联播是对

20、彖,每个观察者都继承于一个统一的接I I。 而被观察的对彖是新闻联播,新闻联播可以添加新的观察者,或者当移除观察者(关电视不 看),新闻联播对象有个通知用户信息变更方法,当达到某种条件是,新闻联播对彖会将信 息都通知给观察者。18抽象工厂模式优点:1. 抽彖工厂模式隔离了具体类的生产,使得客户并不需要知道什么被创建2. 当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一 个产品族中的对彖3. 增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”缺点:增加新的产品等级结构很复杂,需要修改抽彖工厂和所有的具体工厂类,对“开闭 原则”的支持呈现倾斜性。用途:1、一

21、个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有类 型的工厂模式都是重要的。2、系统中有多于一个的产品族,而每次只使用其中某一产品族。3、属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来。4、系统提供一个产品类的库,所有的产品以同样的接II出现,从而使客户端不依赖于 具体实现。经典例子:抽彖工厂在我的理解就是抽彖工厂有两个或两个个以上的工厂方法模式结合,有一 个工厂接II类,这个接II有中的产品家族有发动机和轮胎两个产品。有两个具体工厂, 米其林工厂和倍耐力工厂实现了抽彖工厂。米其林工厂生产的轮胎都继承于米其林轮胎,同理米其林发动机和倍耐力产品。19状

22、态模式优点:1. 把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简 化。2. 将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。3. 通过把各种状态转移逻辑分不到状态与其子类之间,来减少相互间的依赖。缺点:策略模式,每个具体状态类都会产生一个新类,所以会增加系统需要维护的类的数 量。可以使用工厂方法来解决。(我只是把策略二字换成了状态)用途:1. 一个对彖的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。2. 个操作中含有庞大的多分支结构,并且这些分支决定于对象的状态。 经典例子:我上班,上午点,下午,晚上各个时间段不同状态不同算法。这三个状态都

23、继承一个统 一的状态类。都有重写work ()方法,在我调用work的时候,会根据不同的状态调用不同 的 worko20适配器模式优点:1. 将目标类和适配者类解耦2. 增加了类的透明性和复用性,将具体的实现封装在适配者类中,对于客户端类来说 是透明的,而且提高了适配者的复用性3. 灵活性和扩展性都非常好,符合开闭原则缺点:一次最多只能适配一个适配者类,而且目标抽彖类只能为接I】,不能为类,其使用有一 定的局限性,不能将一个适配者类和他的子类同时适配到目标接I。用途:想使用一个已经存在的类,但如果它的接II和你的要求不相同时。可以使用适配器模式。 两个类所做的爭情相同或相似,但接口不同时可以使

24、用。经典例子:不同牌子电视机和不同牌子遥控器,里皮翻译用汉语布置恒人队员战术,不同牌子手机 的软件。球员都继承于中国人,都会说汉语,而里皮并不会说汉语。在不知战术的时候,我们需 要给里皮一个翻译,这个翻译就是里皮的适配器。翻译可以和球员一样,也继承于中国人, 也有说汉语这个方法。而翻译认识里皮,翻译在说汉语()这个方法的时候,实际上是在说 里面用意大利语的内容。Fan yi.shuohanyu()Lipi.yidaliyu();21组合模式优点:1. 使客户端调用简单,客户端可以一致的使用组合结构或其中单个对象,用户就不必 关心自己处理的是单个对象还是整个组合结构,这就简化了客户端代码。2.

25、更容易在组合体内加入对象部件.客户端不必因为加入了新的对彖部件而更改代码。 这一点符合开闭原则的要求,对系统的二次开发和功能扩展很有利!缺点:组合模式不容易限制组合中的构件用途:当你发现需求中是体现部分与整体层次的结构时,以及你希塑可以忽略组合对象与单个 对象的不同,统一地使用组合结构中的所有对彖时,就应该考虑使用组合模式了。典型例子:树形结构,android界面控件22迭代器模式优点:1. 简化了遍历方式,对于对彖集合的遍历,还是比较麻烦的,对于数组或者有序列表, 我们尚町以通过游标来取得,但用户需要在对集合了解很清楚的前提卜,自行遍历 对彖,但是对于hash表来说,用户遍历起来就比较麻烦了

26、。而引入了迭代器方法 后,用户用起来就简单的多了。2. 可以提供多种遍历方式,比如说对有序列表,我们可以根据需要提供正序遍历,倒 序遍历两种迭代器,用户用起来只需要得到我们实现好的迭代器,就町以方便的对 集合进行遍历了。3. 封装性良好,用户只需要得到迭代器就可以遍历,而对于遍历算法则不用去关心。 缺点:对于比较简单的遍历(像数组或者有序列表),使用迭代器方式遍历较为繁琐,人家可 能都有感觉,像Array List,我们宁可愿意使用for循环和get方法来遍历集合,操作简易度 完爆迭代。用途:迭代器模式是与集合共生共死的,一般来说,我们只要实现一个集合,就需要同时提 供这个集合的迭代器,就像j

27、ava中的Collection, List、Set、Map等,这些集合都有自己的 迭代器。假如我们要实现一个这样的新的容器,当然也需要引入迭代器模式,给我们的容器 实现一个迭代器。但是,由于容器与迭代器的关系太密切了,所以人多数语言在实现容器的时候都给 提供了迭代器,并且这些语言提供的容器和迭代器在绝人多数情况卞就可以满足我们的需要, 所以现在需要我们自己去实践迭代器模式的场景还是比较少见的,我们只需要使用语言中已 有的容器和迭代器就可以了。典型例子:Iterator用多了,想不出啥经典例子。23单例模式优点:1. 实例控制,单例模式会阻止其他对彖实例化其自己的单例对彖的副本,从而确保所 有对

28、彖都访问唯一实例。2. 灵活性,因为类控制了实例化过程,所以类可以灵活更改实例化过程。 缺点:1. 可能的开发混淆,使用单例对彖(尤其在类库中定义的对彖)时,开发人员必须记 住自己不能使用new关键字实例化对彖。因为可能无法访问库源代码,因此应用 程序开发人员可能会意外发现自己无法直接实例化此类。2. 不能解决删除单个对象的问题。在提供内存管理的语言中(例如基于.NET Framework 的语言),只有单例类能够导致实例被取消分配,因为它包含对该实例的私有引用。 在某些语言中(如C+),其他类可以删除对彖实例,但这样会导致单例类中出现 悬浮引用。用途:系统只需要一个实例的对象,而这个对彖又会

29、被经常创建。典型例子:数据库类里的Model,例如User,表单中显示用户信息会经常使用User.Update之类的 方法,此时使用单例模式可以节省效率。24命令模式优点:1. 能比较容易的设计一个命令队列2. 可以较容易的将命令加入口志3. 允许接收请求的一方是否处理请求4. 可以容易的实现对请求的添加和删除5. 加进新的具体命令类不会影响到其他的类,增加具体命令类很容易6. 把请求一个操作的对象与指导怎么执行一个操作对彖分开(解耦) 缺点:使用命令模式可能会导致某些系统有过多的具体命令类。因为针对每一个命令都需要设 计一个具体命令类,因此某些系统可能需要人量具体命令类,这将影响命令模式的使用。 用途:1. 系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互。2. 系统需要在不同的时间指定请求、将请求排队和执行请求。3. 系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作。4. 系统需要将一组操作组合在一起,即支持宏命令。典型例子:饭店点菜,每个菜都是命令类的子类,每次点菜都是一道命令(鱼香肉丝命令1肉末茄 子命令2),服务员是中间类,将命令存储在一个数组中(ArrayList),再将命令提交给厨师 来处理。服务员存储的数组命令可以很方便查询记录。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

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

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


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