java模式之---------适配器模式
适配器:将不可行的转换为可行的,比如将别人的女朋友转换为你的女朋友;将别人钱转换为你的钱;将美国的功率转为中国的功率;将不可用的接口转换为可用的接口,诸如此类的,都可称之为适配器。
OK。进入正题。。。。。。。。。。。
在JDK的GUI中,闻名的鼠标监听器就用了适配器的模式,以及等其它的。
把一个类的接口变换成所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作.
适配分为:类适配器与对象适配器,前者是使用继承,后者则是持有引有。那么两者有什么区别呢?在实际的项目中应该优先于哪一种呢?请看下文。
首先以实例来说明,在美国标准插座为60HZ,而在天朝准插座为50HZ,那么现在我们需要用美国的插座了,不能直接使用,那么怎以办呢?则需要一个适配器来为我们的转换的工作,将60HZ转换为50HZ的。OK。明白了么?来看代码吧。
一、类适配器
package com.stiven.adapter.classadapter;/** * 实际需要的接口是50HZ的 * * @author 063 * @version N/A */public interface Target{ public void get50HZ_CH();}
/** * 需要转换的接口,我们称之为被适配者 * * @author 063 * @version N/A */public class SocketAdaptee{ public void get60HZ_US() { System.out.println("美国标准插座"); }}
/** * 适配者,想当于一个转换器 * * @author 063 * @version N/A */public class SocketAdapter extends SocketAdaptee implements Target{ @Override public void get50HZ_CH() { this.get60HZ_US(); System.out.println("通过转换后....我们可以使用天朝的插座了..."); } }
那么通过以下测试类,即可以得到我们需要的东西了。
public class Client{ public static void main(String[] args) { Target target = new SocketAdapter(); target.get50HZ_CH(); }}
OK。看到了吗?类适配器的就是这样干的,适配者去实现接口中的所有方法,并继承被适配者的全部或部分方法,那么用户只需要实现适配器中的接口逻辑后,即可以达到想到的效果。
二、对象适配器
注:部分类与以上相同。
/** * 对象适配器,实现接口并持有被适配者的引用 * * @author 063 * @version N/A */public class ObjectAdater implements Target{ /** * 被适配者的引用,通常称之为需要转换的对象 */ private SocketAdaptee socketAdaptee; public ObjectAdater(SocketAdaptee socketAdaptee) { this.socketAdaptee = socketAdaptee; } @Override public void get50HZ_CH() { socketAdaptee.get60HZ_US(); System.out.println("通过转换后....我们可以使用天朝的插座了..."); } }
public class Client{ public static void main(String[] args) { SocketAdaptee socketAdaptee = new SocketAdaptee(); ObjectAdater objectAdater = new ObjectAdater(socketAdaptee); objectAdater.get50HZ_CH(); } }
OK。看到了吗?与类适配器不同的是,对象适配器是持有被适配者的引用的。如果以后要转换其它对象,修改相就的适配器即可。
顺便在这里说下,对于JDK中的WindowAdapter、MouseAdapter等适配器,那么都是抽象类实现了所有接口中的方法,对于开发者只需实现抽象类的某部分主法,而无需实现接口中的所有方法,这样方便了很多。
那么对于这两种异同有哪些呢?我们在实际的开发中,应优先使用哪一种呢?
对于这个问题还是留给大家来讨论吧。