设计模式大总结 您所在的位置:网站首页 x3650m4内存安装顺序 设计模式大总结

设计模式大总结

#设计模式大总结| 来源: 网络整理| 查看: 265

 

解释器模式 动机

如果在系统中某一特定类型的问题发生的频率很高,此时可以考虑将这些问题的实例表述为一个语言中的句子,因此可以构建一个解释器,该解释器通过解释这些句子来解决这些问题。

定义:

定义语言的文法,并且建立一个解释器来解释该语言中的句子,这里的“语言”意思是使用规定格式和语法的代码。

模式分析:

描述了如何为简单的语言定义一个文法,如何在该语言中表示一个句子,以及如何解释这些句子

 

应用实例:

构建一个语言解释器,使得系统可以执行整数间的乘、除和求模运算。如用户输入表达式“”“3*4/2%4”,输出结果为2。

 

优点: 易于改变和扩展文法易于实现文法增加了新的解释表达式的方法 缺点: 对于复杂文法难以维护执行效率较低应用场景很有限 使用环境: 可以将一个需要解释执行的语言中的句子表示为一个抽象语法树。一些重复出现的问题可以用一种简单的语言来进行表达文法较为简单效率不是关键问题

 

中介者模式 模式动机

在面向对象的软件设计与开发过程中,根据“单一职责原则”,我们应该尽量将对象细化,使其只负责或呈现单一的职责。

2、对于一个模块,可能由很多对象构成,而且这些对象之间可能存在相互的引用,为了减少对象两两之间复杂的引用关系,使之成为一个松耦合的系统,我们需要使用中介者模式。

 

模式定义

用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

 

模式优点 简化了对象之间的交互将各类同事解耦减少子类生成可以简化各同事类的设计

 

模式缺点:

包含了同事之间的交互细节,可能会导致具体中介者类非常复杂,使得系统难以维护。

 

适用环境: 系统中对象之间存在复杂的引用关系,产生的相互依赖关系结构混乱且难以理解。一个对象由于引用了其他很多对象并且直接和这些对象通信,导致难以复用该对象。想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。可以通过引入中介者类来实现,在中介者中定义对象交互的公共行为,如果需要改变行为则可以增加新的中介者类。

 

访问者模式 模式动机

对于系统中的某些对象,它们存储在同一个集合中,且具有不同的类型,而且对于该集合中的对象,可以接受一类称为访问者的对象来访问,而且不同的访问者其访问方式有所不同,访问者模式为解决这类问题而诞生。

 

模式定义

表示一个作用于某对象结构中的各元素的操作,它使我们可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

 

模式分析: 访问者模式中对象结构存储了不同类型的元素对象,以供不同访问者访问。访问者模式包括两个层次结构,一个是访问者层次结构,提供抽象访问者和具体访问者,一个是元素层次结构,提供了抽象元素和具体元素。相同的访问者可以以不同的方式访问不同的元素,相同的元素可以接受不同访问者以不同访问方式访问。在访问者模式中,增加新的访问者无须修改原有系统,系统具有较好的可扩展性。

 

 

实例一:购物车

顾客在超市中将选择的商品,如苹果、图书等放在购物车中,然后到收银员处付款。在购物过程中,顾客需要对这些商品进行访问,以便确认这些商品的质量,之后收银员计算价格时也需要访问购物车内顾客所选择的商品。此时,购物车作为一个ObjectStructure(对象结构)用于存储各种类型的商品,而顾客和收银员作为访问这些商品的访问者,他们需要对商品进行检查和计价。不同类型的商品其访问形式也可能不同,如苹果需要过秤之后再计价,而图书不需要。使用访问者模式来设计该购物过程。

 

优点: 使得增加新的访问操作变得很容易将有关元素对象的访问行为集中到一个访问对象中,而不是分散到一个个的元素类中。可以跨过类的等级结构访问属于不同的等级结构的元素类。让用户能够在不修改现有类层次结构的情况下,定义该类层次结构的操作。

 

使用环境:

1、一个对象结构包含很多类型的对象,希望对这些对象实施一些依赖其具体类型的操作。在访问者中针对每一种具体的类型都提供了一个访问操作,不同类型的对象可以有不同的访问操作。

 

2、需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作“污染”这些对象的类,也不希望在增加新操作时修改这些类。访问者模式使得我们可以将相关的访问操作集中起来定义在访问者类中,对象结构可以被多个不同的访问者类所使用,将对象本身与对象的访问操作分离。

 

3、对象结构中对象对应的类很少改变,但经常需要在此对象结构上定义新的操作。

 

策略模式 模式动机 完成一项任务,往往可以有多种不同的方式,每一种方式称为一个策略,我们可以根据环境或者条件的不同选择不同的策略来完成该项任务。在软件开发中也常常遇到类似的情况,实现某一个功能有多个途径,此时可以使用一种设计模式来使得系统可以灵活地解决途径,也能够方便地增加新的解决途径。

 

模式定义

定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而改变。

 

模式分析

策略模式是对算法的封装,它把算法的责任和算法本身分隔开,委派给不同的对象管理。策略模式通常把一个系列的算法封装到一系列的策略类里面,作为一个抽象策略类的子类。

实例应用:

某系统提供了一个用于对数组数据进行操作的类,该类封装了对数组的常见操作,如查找数组元素、对数组元素进行排序等。现以排序操作为例,使用策略模式设计该数组操作类,使得客户端可以动态地更换排序算法,可以根据需要选择冒泡排序或选择排序或插入排序,也能够灵活地增加新的排序算法。

 

模式优点: 提供了对“开闭原则”的完美支持,用户可以在不修改原有系统的基础上选择算法或行为,也可以灵活地增加新的算法或行为。策略模式提供了管理相关的算法族的办法策略模式提供了可以替换继承关系的办法避免使用多重条件转移语句

 

使用环境: 如果一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。一个系统需要动态地在几种算法中选择一种如果一个对象有很多行为,如果不同恰当的模式,这些行为就只好使用多重的条件选择语句来实现。不希望客户端知道复杂的、与算法相关的数据结构,在具体策略类中封装算法和相关的数据结构,提高算法的保密性与安全性。

 

备忘录模式 模式动机: 在应用软件的开发过程中,很多时候我们都需要记录一个对象的内部状态。在具体实现过程中,为了允许用户取消不确定的操作或从错误中恢复过来,需要实现备份点和撤销机制,而要实现这些机制,必须事先将状态信息保存在某处,这样才能将对象恢复到它们原先的状态。备忘录模式是一种给我们的软件提供后悔药的机制,通过它可以使系统恢复到某一特定的历史状态。 模式定义

在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。

应用实例:

某系统提供了用户信息操作模块,用户可以修改自己的各项信息。为了使操作过程更加人性化,现使用备忘录模式对系统进行改进,使得用户在进行了错误操作之后可以恢复到操作之前的状态。

 

模式的优点 提供了一种状态恢复的实现机制,使得用户可以方便地找回到一个特定的历史步骤,当新的状态无效或者存在问题时,可以使用先前存储起来的备忘录将状态恢复。实现信息的封装,一个备忘录对象是一种原发器对象的表示,不会被其他代码改动,这种模式简化了原发器对象,备忘录只保存原发器的状态,采用堆栈来存储备忘录对象可以实现多次撤销操作,可以通过在负责人中定义集合对象来存储多个备忘录。

 

使用环境 保存一个对象在某一个时刻的状态或部分状态,这样以后需要时它能够恢复到先前的状态。如果用一个接口来让其他对下那个得到这些状态,将会暴露对象的实现细节并破坏对象的封装性,一个对象不希望外界直接访问其内部状态,通过负责人可以间接访问其内部状态。 迭代器模式 模式动机: 一个聚合对象,例如一个集合,应该提供一种方法来让别人可以访问它的元素,而又不需要暴露它的内部结构。针对不同的需要,可能还要以不同的方式遍历整个聚合对象,但是我们并不希望在聚合对象的抽象层接口中充斥着各种不同遍历的操作。遍历一个聚合对象,不需要了解聚合对象的内部结构,还能够提供多种不同的遍历方式,这就是迭代器模式要解决的问题 模式定义:

提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名游标。

 

应用实例:

电视机遥控器就是一个迭代器的实例,通过它可以实现对电视机频道集合的遍历操作。

模式的优点: 它支持以不同的方式遍历一个聚合对象。迭代器简化了聚合类在同一个聚合上可以有多个遍历在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码,满足“开闭原则”的要求。 使用环境: 访问一个聚合对象的内容而无须暴露它的内部表示需要为聚合对象提供多种遍历方式为遍历不同的聚合结构提供一个统一的接口


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有