设计模式及优点总结

  • 格式:docx
  • 大小:719.07 KB
  • 文档页数:18

下载文档原格式

  / 22
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

桥接模式——Bridge

将抽象部分与它的实现部分分离,使它们都可以独立地变化。

什么叫抽象与它的实现分离,这并不是说,让抽象类与其派生类分离,因为这没有任何

意义。实现指的是抽象类和它的派生类用来实现自己的对象。由于实现的方式有多种,桥接模式的核心意图就是把这些实现独立出来,让它们独自地变化。这就使得每种实现的变化不会影响其他实现,从而达到应对变化的目的。

桥接模式的结构图如下:

将抽象部分与它的实现部分分离,这不是很好理解,我的理解就是实现系统可能有很多角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让它们独立变化,减少它们之间的耦合。也就是说,在发现我们需要多角度去分类实现对象,而只用继承会造成大量的类增加,不能满足开放—封闭原则时,就应该要考虑桥接模式。

单例模式——Singleton

单例模式,保证一个类仅有一个实例,并提供一个访问它的全局访问点。

通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象,一个最好的办法就是,让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且他可以提供一个访问该实例的方法。

单例模式的结构图如下:

单例模式因为Singletion类封装它的唯一实例,这样它可以严格控制客户怎样访问它以及何时访问它。简单地说就是对唯一实例的受控访问。

当在多线程情景下使用时,需要对GetInstance全局访问点加锁。适配器模式(Adapter)

将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼

容而不能一起工作的哪些类可以一起工作。

也就是说系统的数据和行为都是正确的但接口不符时,我们应该考虑用适配器模式,目的是使控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况,比如说需要对早期代码复用一些功能等应用上很有实际价值。

适配器又两种类型,类适配器模式和对象适配器模式。但由于类适配器通常是通过多重继承实现的,而C#、、JAVA等语言都不支持多重继承,也就是一个类只有一个父类,所以,我们这里主要讲对象适配器。

适配器模式的结构图如下:

Target:这是客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。

Adaptee:需要适配的类。

Adapter:通过在内部包装一个Adaptee对象,把源接口转换成目标接口。

2、何时使用适配器模式

在使用一个已存在的类时,如果它的接口,也就是它的方法和你的要求不相同时,就应

该考虑使用适配器模式。这样客户端可以调用统一接口就行了,这样客户端代码就可以更简单、更直接、更紧凑。

但是适配器模式也是无奈之举,很有点亡羊补牢的感觉,但是是软件就有维护的一天,所以,通常在软件开发的中后期或维护期在考虑使用它。这也就是说,一个项目在设计阶段类和方法名就应该要有规范,最好前期就设计好,然后如果在开发阶段发现接口不一致,这时候首先

也不应该考虑使用适配器模式,而应该首先考虑去重构统一接口。只有在双方都不太容易修改的时候再使用适配器模式,而不是一有不同就使用它。

备忘录模式(Memento)

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状

态。这样以后就可将该对象恢复到原先保存的状态。

被网络模式结构图

Originator(发起人):负责创建一个备忘录,用以记住当前时刻它的内部状态,并可使用备忘录恢复内部状态。Originator可根据需要决定Memento存储Originator的那些内部状态。

Memento(备忘录):负责存储Originator对象的内部状态,并可防止Originator以外的其他对象访问备忘录。备忘录有两个接口,Caretaker 只能看到备忘录的窄接口,他只能将备忘录传递给其他对象。Originator 能够看到一个宽接口,允许访问返回到先前状态所需的所有数据。Caretaker(管理者):负责保存好备忘录,不能对备忘录的内容进行操作或检查。

2、何时使用备忘录模式

Memento模式比较适合功能比较复杂的,但需要维护或者记录属性历史的类,或者需要

保存的属性只是众多属性中的一小部分时,Originator可以根据保存的Memento信息还原到前一状态。

如果在某个系统中使用命令模式时,需要实现命令的撤销功能,那么命令模式可以使用备忘录模式来存储可撤销的状态。

状态模式(State)

当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。

状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。

状态模式的结构图如下:

State:抽象状态类,定义一个接口以封装与Context的一个特定状态相关的行为。

ConcreteState:具体状态,每一个子类实现一个与Context的一个状态相关的行为。

Context:维护一个ConcreteState子类的实例,这个实例定义当前的状态。

2、状态模式的好处与用处

将特定的状态相关的行为都放入一个对象中,由于所有与状态相关的代码都存在于某个

ConcreteState中,所以,通过定义新的子类可以很容易地增加新的状态和转换。这样就消除了庞大的条件分支语句。大的分支语句判断会使得它们难以修改和扩展。状态模式通过把各种状态转移逻辑分不到State的子类之间,来减少相互间的依赖。

当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式了。

组合模式

将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象

和组合对象的使用具有一致性。

组合模式的结构图如下:

Component为组合中的对象声明接口,在适当情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component的子部件。

Leaf:在组合中表示节点对象,叶节点没有子节点。