分享
 
 
 

爪哇语言结构性模式之变压器模式介绍(上)

王朝other·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

什么是结构性模式

结构性模式描述类和对象怎样结合在一起成为较大的结构。 结构性模式描述两种不同的东西:类与类的实例。根据它们所描述的东西的不同, 结构性模式可以分为类结构模式和实例结构模式两种。

类结构模式使用继续(inheritance)来把类,接口等组合在一起,形成更大的结构。 当一个类从父类继续,并实现某接口时,这个新的类就把父类的结构和接口的结构结合起来。 类结构模式是静态的。一个类结构模式的典型的例子,就是类形式的变压器模式。

实例结构模式描述各种不同类型的把对象组合在一起,实现新的功能的方法。实例结构模式是动态的。 一个典型的实例结构模式,就是代理人模式,代理人模式将在以后介绍。其它的例子包括后面将要介绍的复合模式, 飞行重量模式,装饰模式,以及实例形式的变压器模式等。

有一些模式会有类结构模式的形式和实例结构模式的形式两种,成为以上两种形式的结构模式的极好注解。 本节要介绍的变压器模式就是这样,它有类形式和实例形式两种。

变压器模式的介绍

变压器模式把一个类的接口变换成客户端所期待的另一种接口。变压器模式使原本无法在一起工作的两个类能够在一起工作。 如前所述,变压器模式是关于类结构的结构性模式,因而是静态的模式。

这很象变压器(Adapter)---变压器把一种电压变换成另一种电压。当我把美国的电器拿回中国大陆去用的时候, 我就面临电压不同的问题。美国的生活用电压是110伏,而中国的电压是220伏。我假如要在中国大陆使用我在美国使用的电器, 我就必须有一个能把220伏电压转换成110伏电压的变压器。而这正象是本模式所做的事,因此此模式被称为变压器模式。

读者可能也会想到,Adapter在中文也可翻译为转换器(适配器)。实际上,转换器(适配器)也是一个合适的名字。仍用电器作例子, 美国的电器的插头一般是三相的,即除了阳极,阴极外,还有一个地极。中国大陆的建筑物内的电源插座一般只有两极,没有地极。 这时候,即便电器的确可以接受220伏电压,电源插座和插头不匹配,也使电器无法使用。 一个三相到两相的转换器(适配器)就能解决这个问题。因此此模式也可被称为转换器(适配器)模式。

同时,这种做法也很象包装过程,被包装的物体的真实样子被包装所掩盖和改变,因此有人把这种模式叫做包装(Wrapper)模式。事实上, 我们经常写很多这样的wrapper类,把已有的一些类包裹起来,使之能有满足需要的接口。

变压器模式有类形式和实例形式两种不同的形式。

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

图1. 类形式的类变压器模式的类图定义

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

目标(Target)。这就是我们所期待得到的接口。注重,由于这里讨论的是类变压器模式,因此目标不可以是类。

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

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

本模式的示范代码如下:

package com.javapatterns.adapter.classAdapter;

public interface Target

{

/**

* Class Adaptee contains Operation sampleOperation1.

*/

void sampleOperation1();

/**

* Class Adaptee doesn't contain operation sampleOperation2.

*/

void sampleOperation2();

}

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

package com.javapatterns.adapter.classAdapter;

public class Adaptee

{

public void

sampleOperation1(){}

}

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

package com.javapatterns.adapter.classAdapter;

public class Adapter extends Adaptee implements Target

{

/**

* Class Adaptee doesn't contain operation sampleOperation2.

*/

public void sampleOperation2()

{

// Write your code here

}

}

代码清单3. Adapter的源代码。

类形式的变压器模式的效果

第一、 使用一个实类把源(Adaptee)适配到目标(Target)。这样一来,假如你想把源以及源的子类都使用此类适配, 就行不通了。

第二、 由于变压器类是源的子类,因此可以在变压器类中置换(override)掉源的一些方法。

第三、 由于只引进了一个变压器类,因此只有一个路线到达目标类。问题得到简化。

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

在图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中,有很多的变压器类。如:

库程序包java\awt\event中有

ComponentAdapter

ContainerAdapter

FocusAdapter

HierarchyBoundsAdapter

KeyAdapter

MouseAdapter

MouseMotionAdapter

WindowAdapter

库程序包Javax\swing\event中有

InternalFrameAdapter

MouseInputAdapter

这些都是变压器模式使用的实际例子。值得指出的是,WindowAdapter的建立者们不可能预见到你所要使用的目标接口, 因此WindowAdapter不可能实现你的目标接口。但是,在考察了这些变压器类的使用范围之后,我们会发现, WindowAdapter只需实现WindowListener的接口即可,也就是说,目标接口被省略了。请见下面的解释。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有