- 9
- 0
- 约6.93千字
- 约 59页
- 2017-01-01 发布于重庆
- 举报
面向对象技术 第6讲 结构型模式 适配器模式 将一个类的接口转换成客户希望的另一个接口,使得原本由于接口不兼容而不能在一起工作的那些类可以一起工作。 意图 使接口不兼容的类能够协同工作。通常情况下,这些接口不兼容的类在逻辑上的功能是一致或者相似的。例如采用RS232协议和TCP/IP的目的都是为了传输数据,支持这两种协议的API却是截然不同的。 适配器模式 实现结构 适配器有类适配器和对象适配器两种类型,二者的意图相同,只是实现的方法和适用的情况不同。类适配器采用继承来实现,对象适配器则采用组合的方法来实现。 适配器模式 对象适配器:对象适配器采用对象组合,通过引用一个类与另一个类接口。 适配器模式 类适配器:类适配器通过多继承对一个接口与另一个接口进行匹配。 适配器模式 说明: Target定义了Client使用的与特定领域相关的接口,Client通过调用Target实现某一个特定的操作。 Adaptee是一个已经存在的类,需要与Target协同工作,这个接口需要适配。 Adapter适配器适配Adaptee和Target接口。 在类适配器中,通过继承获得Adaptee中的方法,而对象适配器则通过委托对象使用Adaptee中的方法。 适配器模式 类适配器和对象适配器的异同: 类适配器和对象适配器有不同的权衡。 类适配器用一个具体的Adapter类对Adaptee和Target进行匹配。但当我们想要匹配一个类以及所有它的子类时,类Adapter将不能胜任工作; Adapter可以重定义Adaptee的部分行为,因为Adapter是Adaptee的一个子类; 仅仅引入了一个对象,并不需要额外的指针以间接得到Adaptee。 适配器模式 类适配器和对象适配器的异同: 对象适配器则允许一个Adapter与多个Adaptee—即Adaptee本身以及它的所有子类同时工作。Adapter也可以一次给所有的Adaptee添加功能; 这使得重定义Adaptee的行为比较困难。 适配器模式 范例 TCP/RS232通信代理 适配器模式 使用场合 适配器模式适用于以下情况。 (1)需要使用一个已经存在的类,但接口与设计要求不符。 (2)希望创建一个可以复用的类,该类可以与其他不相关的类或者是将来不可预见的类协同工作。 在使用适配器时应注意理解适配器的方向性,即注意区分适配器中的Adaptee(适配对象)和Target(目标),在适配器的原理图中很容易看出Target,即被客户操作的是目标。 对象装饰 在软件系统中,有时候我们会使用继承来扩展对象的功能,但是由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性;并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会导致更多子类的膨胀。如何使“对象功能的扩展”能够根据需要来动态地实现?同时避免“扩展功能的增多”带来的子类膨胀问题?从而使得任何“功能扩展变化”所导致的影响将为最低?这就是本文要讲的Decorator模式。 对象装饰 动态地给对象添加一些额外的职责,就功能来说装饰模式相比生成子类更为灵活。 意图 动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。 对象装饰 实现 在界面设计中,一种较为灵活的实现方式是将组件嵌入另一个对象中,我们称这个嵌入的对象为装饰。这个装饰与它所装饰的组件接口一致,因此它对使用该组件的客户透明。透明性使得你可以递归的嵌套多个装饰,从而可以添加任意多的功能。 对象装饰 实现 对象装饰 特点: 比静态继承更灵活,与对象的静态继承相比, Decorator模式提供了更加灵活的向对象添加职责的方式。可以用添加和分离的方法,用装饰在运行时刻增加和删除职责。相比之下,继承机制要求为每个添加的职责创建一个新的子类,这会产生许多新的类,并且会增加系统的复杂度。 对象装饰 特点: 避免在层次结构高层的类有太多的特征,Decorator模式提供了一种“即用即付”的方法来添加职责。它并不试图在一个复杂的可定制的类中支持所有可预见的特征,相反,你可以定义一个简单的类,并且用Decorator类给它逐渐地添加功能。可以从简单的部件组合出复杂的功能。这样,应用程序不必为不需要的特征付出代价。同时也更易于不依赖于Decorator所扩展的类而独立地定义新类型的Decorator。扩展一个复杂类的时候,很可能会暴露与添加的职责无关的细节;Decorator与它的Component不一样,Decorator是一个透明的包装。如果我们从对象标识的观点出发,一个被装饰了的组件与这个组件是有差别的,因此,使用装饰时不应该依赖对象标识。 对象装饰 使用场合 在以下情况下应当使用装饰模式: 1.需要扩展一个类的功能,或给一个
原创力文档

文档评论(0)