您的位置:首页 > 其它

学习设计模式 (三)(总结)

2016-03-10 16:35 295 查看

17.责任链模式

责任链模式:如果有多个对象都有机会处理请求,责任链可使请求的发送者和接收者解耦,请求沿着责任链传递,直到有一个对象处理了它为止。

类图:



优点:

1.将请求的发送者和接收者解耦,使多个对象都有机会处理这个请求

2.可以简化对象,因为它无须知道链的结构

3.可以动态地增加或删除处理请求的链结构

缺点:

1.请求从链的开头进行遍历,对性能有一定的损耗

2.并不保证请求一定被处理

责任链模式和状态模式的区别:

责任链模式注重请求的传递,而状态模式注重对象状态的转换

18.蝇量模式(享元模式)

定义:通过共享的方式高效地支持大量细颗粒度的对象



类图:



优点:

  减少运行时对象实例的个数,节省内存。

  将许多“虚拟”对象的状态集中管理。

用途:

  当一个类有许多的实例,而这些实例能被同一方法控制的时候,我们就可以使用蝇量模式。

缺点:

  蝇量模式的缺点在于,一旦你实现了它,那么单个的逻辑实例将无法拥有独立的而不同的行为,使系统更复杂。


19.解释器模式

定义:给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。
类图:



(1)抽象解释器(AbstractExpression)角色:声明一个所有的具体表达式角色都需要实现的抽象接口。这个接口主要是一个interpret()方法,称做解释操作。

(2)终结符解释器(Terminal Expression)角色:实现了抽象表达式角色所要求的接口,主要是一个interpret()方法;文法中的每一个终结符都有一个具体终结表达式与之相对应。比如有一个简单的公式R=R1+R2,在里面R1和R2就是终结符,对应的解析R1和R2的解释器就是终结符表达式。

(3)非终结符[b]解释器(Nonterminal Expression)角色:[/b]文法中的每一条规则都需要一个具体的非终结符表达式,非终结符表达式一般是文法中的运算符或者其他关键字,比如公式R=R1+R2中,“+"就是非终结符,解析“+”的解释器就是一个非终结符表达式。

(4)环境(Context)角色:这个角色的任务一般是用来存放文法中各个终结符所对应的具体值,比如R=R1+R2,我们给R1赋值100,给R2赋值200。这些信息需要存放到环境角色中,很多情况下我们使用Map来充当环境角色就足够了。

优点:

  将每一个语法规则表示成一个类,方便于实现语言。

  因为语法由许多类表示,所以你可以轻易地改变或扩展此语言。

  通过在类结构中加入新的方法,可以在解释的同时增加新的行为,例如打印格式的美化或者进行复杂的程序验证。

用途:

  当你需要实现一个简单的语言时,使用解释器。

  当你有一个简单的语法,而且简单比效率更重要时,使用解释器。

  可以处理脚本语言和编程语言。

缺点:

  当语法规则的数目太大时,这个模式可能会变得非常繁杂。在这种情况下,使用解释器/编译器的产生器可能更合适。

20.中介者模式

定义:用一个中介者对象来封装一系列的对象交互

例子场景:有一个自动屋,但是其中有着复杂的规则。想要持续地追踪每个对象的每个规则,以及众多对象之间彼此错综复杂的关系,实在不容易。

  在这个系统中加入一个中介者,一切都变得简单了:
  每个对象都会在自己的状态改变时,告诉中介者。
  每个对象都会对中介者所发出的请求作出回应。



  中介者内包含了整个系统的控制逻辑。当某装置需要一个新的规则时,或者是一个新的装置被加入系统内,其所有需要用到的逻辑也都被加进了中介者内。

类图:



优点:
  通过将对象彼此解耦,可以增加对象的复用性。
  通过将控制逻辑集中,可以简化系统维护。
  可以让对象之间所传递的消息变得简单而且大幅减少。
用途:
  中介者常常被用来协调相关的GUI组件。
缺点:
  中介者模式的缺点是,如果设计不当,中介者对象本身会变得过于复杂。


中介者模式、代理模式和外观模式三者的区别与联系

1,中介者模式:A,B之间的对话通过C来传达。A,B可以互相不认识(减少了A和B对象间的耦合)

2,代理模式:A要送B礼物,A,B互相不认识,那么A可以找C来帮它实现送礼物的愿望(封装了A对象)

3,外观模式:A和B都要实现送花,送巧克力的方法,那么我可以通过一个抽象类C实现送花送巧克力的方法(A和B都继承C)。(封装了A,B子类)

代理模式和外观者模式这两种模式主要不同就是代理模式针对的是单个对象,而外观模式针对的是所有子类。


21.备忘录模式

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

类型:行为类

类图:



我们在编程的时候,经常需要保存对象的中间状态,当需要的时候,可以恢复到这个状态。比如,我们使用Eclipse进行编程时,假如编写失误(例如不小心误删除了几行代码),我们希望返回删除前的状态,便可以使用Ctrl+Z来进行返回。这时我们便可以使用备忘录模式来实现。

备忘录模式的结构

发起人:记录当前时刻的内部状态,负责定义哪些属于备份范围的状态,负责创建和恢复备忘录数据。
备忘录:负责存储发起人对象的内部状态,在需要的时候提供发起人需要的内部状态。
管理角色:对备忘录进行管理,保存和提供备忘录。

优点:

1.状态存储在外面,不和关键对象混在一起,这可以帮助维护内聚

2.提供了容易实现的恢复能力

3.保持了关键对象的数据封装

缺点:

1.资源消耗上面备忘录对象会很昂贵

2.存储和恢复状态的过程比较耗时


22.原型模式

定义:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。

类图:



原型模式主要用于对象的复制,它的核心是就是类图中的原型类Prototype。Prototype类需要具备以下两个条件:

1.实现Cloneable接口。在java语言有一个Cloneable接口,它的作用只有一个,就是在运行时通知虚拟机可以安全地在实现了此接口的类上使用clone方法。在java虚拟机中,只有实现了这个接口的类才可以被拷贝,否则在运行时会抛出CloneNotSupportedException异常。

2.重写Object类中的clone方法。Java中,所有类的父类都是Object类,Object类中有一个clone方法,作用是返回对象的一个拷贝,但是其作用域protected类型的,一般的类无法调用,因此,Prototype类需要将clone方法的作用域修改为public类型。

原型模式是一种比较简单的模式,也非常容易理解,实现一个接口,重写一个方法即完成了原型模式。

优点:
1.使用原型模式创建对象比直接new一个对象更有效
2.隐藏制造新实例的复杂性
3.重复地创建相似对象时可以考虑使用原型模式
缺点:

1.一个类必须配备一个克隆方法
2.深层复制比较复杂、
注意事项:
1.使用原型模式复制对象不会调用类的构造方法。所有,单例模式与原型模式是冲突的,在使用时要特别注意。
2.Object类的clone方法只会拷贝对象中的基本的数据类型,对于数组、容器对象、引用对象等不会拷贝,这就是浅拷贝。如果要实现深拷贝,必须将原型模式中的数组、容器对象、引用对象等另行拷贝

23.访问者模式

定义:封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。

类图:



优点:
1.符合单一责任原则
2.扩展性良好
3.有益于系统的管理和维护
缺点:
1.增加新的元素类变的很困难
2.破环封装性
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: