一文掌握14个高大尚设计模式的适用场景(图例)!!!------2

340 阅读9分钟

代码地址在文末

8 桥接模式

模拟毛笔 现需要提供大中小3种型号的画笔,能够绘制5种不同颜色,如果使用蜡笔,我们需要准备3*5=15支蜡笔,也就是说必须准备15个具体的蜡笔类。而如果使用毛笔的话,只需要3种型号的毛笔,外加5个颜料盒,用3+5=8个类就可以实现15支蜡笔的功能。请使用桥接模式来模拟毛笔的使用过程。 用JAVA语言实现(C#控制台应用程序实现)该模式。绘制该模式的UML图。

在这里插入图片描述 桥接模式主要适用于以下情况:

  • 如果一个系统需要在抽象类和具体类之间增加更多的灵活性,避免在两个层次之间建立静态的继承关系,通过桥接模式可以使它们在抽象层建立一个关联关系。
  • 抽象部分和实现部分可以以继承的方式独立扩展而互不影响,在程序运行时可以动态的将一个抽象类子类的对象和一个实现类子类的对象进行组合,及系统需要对抽象类角色和实现类角色进行动态耦合。
  • 一个类存在两个(或多个)独立变化的维度,且这两个(或多个)维度都需要独立进行扩展。
  • 对于那些不希望使用继承或因为多层继承导致系统的个数急剧增加的系统,桥接模式尤为适用。

9 迭代器模式

电视机遥控器就是一个迭代器的实例,通过它可以实现对电视机频道集合的遍历操作,迭代器模式模拟电视机遥控器的实现。用JAVA语言实现 (或C#控制台应用程序实现)。绘制该模式的UML图。

1

迭代器模式适用环境 • 访问一个聚合对象的内容而无须暴露它的内部表示. • 需要为一个聚合对象提供多种遍历方式. • 为遍历不同的聚合结构提供一个统一的接口,在该接口的实现类中为不同的聚合结构提供不同的遍历方式,而客户端可以一致性地操作该接口.

10 访问者模式

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

在这里插入图片描述 访问者模式主要适用于以下情况:

  • 一个对象结构包含多个类型的对象,希望对这些对象实施一些依赖其具体类型的操作。在访问者中针对每一种具体的类型都提供了一个访问操作,不同类型的对象可以有不同的访问操作。
  • 需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而且需要避免让这些操作“污染”这些对象的类,也不希望在增加新操作时修改这些类。访问者模式将相关的访问操作集中起来定义在访问者类中,对象结构可以被多个不同的访问者类所使用,将对象本身与对象的访问操作分离。
  • 对象结构中对象对应的类很少改变,但经常需要在此对象结构上定义新的操作。

11 命令模式

电视机是请求的接收者,遥控器是请求的发送者,遥控器上有一些按钮,不同的按钮对应电视机的不同操作。抽象命令角色由一个命令接口来扮演,有三个具体的命令类实现了抽象命令接口,这三个具体命令类分别代表三种操作:打开电视机、关闭电视机和切换频道。显然,电视机遥控器就是一个典型的命令模式应用实例。 用JAVA语言实现 (或C#控制台应用程序实现)电视机遥控器的命令模式。绘制该模式的UML图。

在这里插入图片描述 命令模式适用环境:

  • 系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互.请求调用者无须知道接收者的存在也无须知道接收者是谁,接收者也无须关心何时被调用.
  • 系统需要在不同的时间指定请求,将请求排队和执行请求.一个命令对象和请求的初始调用者可以有不同的生命期,换言之,最初的请求发出者可能已经不在了,而命令对象本身仍然是活动的,可以通过该命令对象去调用请求接收者,而无须关心请求调用者的存在性,可以通过请求日志文件等机制来具体实现.
  • 系统需要支持命令的撤销操作和恢复操作.
  • 系统需要将一组操作组合在一起形成宏命令.

12 中介者模式

某论坛系统欲增加一个虚拟聊天室,允许论坛会员通过该聊天室进行信息交流,普通会员(CommonMember)可以给其他会员发送文本信息,钻石会员(DiamondMember)既可以给其他会员发送文本信息,还可以发送图片信息。该聊天室可以对不雅字符进行过滤,如“日”等字符;还可以对发送的图片大小进行控制。用中介者模式设计该虚拟聊天室。 用JAVA语言实现(C#控制台应用程序实现)中介者模式。绘制该模式的UML图。

1 在以下情况下可以使用中介者模式:

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

13 策略模式

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

1 适用性:

  • 许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法.
  • 需要使用一个算法的不同变体
  • 算法使用客户不应该知道的数据。避免暴露复杂的、与算法相关的数据结构
  • 一个类定义了多种行为,并且这些行为在类的操作中以多个条件语句的形式出现

14 状态模式

在某论坛系统中,用户可以发表留言,发表留言将增加积分;用户也可以回复留言,回复留言也将增加积分;用户还可以下载文件,下载文件将扣除积分。该系统用户分为三个等级,分别是新手、高手和专家,这三个等级对应三种不同的状态,这三种状态分别定义如下: (1) 如果积分小于100分,则为新手状态,用户可以发表留言、回复留言,但是不能下载文件。如果积分大于等于1000分,则转换为专家状态;如果积分大于等于100分,则转换为高手状态。 (2) 如果积分大于等于100分但小于1000分,则为高手状态,用户可以发表留言、回复留言,还可以下载文件,而且用户在发表留言时可以获取双倍积分。如果积分小于100分,则转换为新手状态;如果积分大于等于1000分,则转换为专家状态;如果下载文件后积分小于0,则不能下载该文件。 (3) 如果积分大于等于1000分,则为专家状态,用户可以发表留言、回复留言和下载文件,用户除了在发表留言时可以获取双倍积分外,下载文件只扣除所需积分的一半。如果积分小于100分,则转换为新手状态;如果积分小于1000分,但大于等于100,则转换为高手状态;如果下载文件后积分小于0,则不能下载该文件。

在这里插入图片描述 通常在以下情况下可以考虑使用状态模式:

  • 当一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为时,就可以考虑使用状态模式。
  • 一个操作中含有庞大的分支结构,并且这些分支决定于对象的状态时。

代码 gitee.com/rightstar/s…