电脑技术学习

java结构性模式之变压器模式介绍(二)

dn001
内容: 实例形式的变压器模式的定义


  实例形式的变压器模式的类图定义如下。


IMG http://www.yesky.com/20011225/jt1225-1-objectadapter.gif[/IMG]图2. 实例变压器模式的类图定义

在图1可以看出,模式所涉及的成员有:


目标(Target)。这就是我们所期待得到的接口。目标可以是实的或抽象的类。


源(Adaptee)。现有需要适配的接口。


变压器(Adapter)。变压器类是本模式的核心。变压器把源接口转换成目标接口。 显然,这一角色必须是实类。

  本模式的示范代码如下:


package com.javapatterns.adapter;
public interface Target {
/**
* Class Adaptee contains operation sampleOperation1.
*/
void sampleOperation1();
/**
* Class Adaptee doesn't contain operation sampleOperation2.
*/
void sampleOperation2();
}

代码清单4. Target的源代码。


package com.javapatterns.adapter;
public class Adapter implements Target {
public Adapter(Adaptee adaptee){
super();
this.adaptee = adaptee;
}
public void sampleOperation1(){
adaptee.sampleOperation1();
}
public void sampleOperation2(){
// Write your code here
}
private Adaptee adaptee;
}
  
代码清单5. Adapter的源代码。


package com.javapatterns.adapter;
public class Adaptee {
public void sampleOperation1(){}
}

代码清单6. Adaptee的源代码。

  实例形式的变压器模式的效果

  第一、 一个变压器可以把多种不同的源适配到同一个目标。换言之,同一个变压器可以把源类和它的子类都适配到目标接口。

  第二、 与类形式的变压器模式相比,要想置换源类的方法就不容易。如果一定要置换掉源类的一个或多个方法,就只好先做一个源类的子类, 将源类的方法置换掉,然后再把源类的子类当作真正的源进行适配。

  第三、 虽然要想置换源类的方法不容易,但是要想增加一些新的方法则方便得很。 而且新增加的方法同时适用于所有的源。
在什么情况下使用变压器模式

  在以下各种情况下使用变压器模式:

  第一、 你需要使用现有的类,而此类的接口不符合你的需要。

  第二、 你想要建立一个可以重复使用的类,用以与一些彼此之间没有太大关联的一些类, 包括一些可能在将来引进的类一起工作。这些源类不一定有很复杂的接口。

  第三、 (对实例形式的变压器模式而言)你需要改变多个已有的子类的接口, 如果使用类形式的变压器模式,就要针对每一个子类做一个变压器类,而这不太实际。

  J2SE中的变压器模式的使用

  在爪哇语言2.0的标准SDK中,有很多的变压器类。如:

库程序包javaawtevent中有


ComponentAdapter
ContainerAdapter
FocusAdapter
HierarchyBoundsAdapter
KeyAdapter
MouseAdapter
MouseMotionAdapter
WindowAdapter


库程序包Javaxswingevent中有


InternalFrameAdapter
MouseInputAdapter

  这些都是变压器模式使用的实际例子。值得指出的是,WindowAdapter的建立者们不可能预见到你所要使用的目标接口, 因此WindowAdapter不可能实现你的目标接口。但是,在考察了这些变压器类的使用范围之后,我们会发现, WindowAdapter只需实现WindowListener的接口即可,也就是说,目标接口被省略了。请见下面的解释。
from-yesky Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd

标签: