今天来说一说适配器模式,我先来举个例子,我们国家的电压是220V,可能有的国家是110V,那如果我们去旅游,到了那里想给手机充电怎么办呢?直接冲肯定不行,可能还会s损坏手机,这时候我们就需要一个转换器了,吧110v转换为220v,这样就可以了。这个时候,这个转换器就充当了适配器的角色。
学习之前我们先了解一下概念
1、目标接口(Target):客户所期待的接口。通俗的来讲,就是我们所需要的220v电压,我们希望有220v的电压用,我们并不关系具体这个电压怎么来的额,能用就行。所以这里这个220v就是我们的目标接口。
2、适配器(Adapter):在这里,指的就是那个转换器,是能看的见摸得着的,反正就是一个具体的物体,进去110v出来就是220v。
3、需要适配的类(Adaptee):在这里指的就是那个110v电压,是待转换的对象。
明确概念之后,我们来看看代码,先看包结构
先来看看接口
package com.adapt.target;
/**
* 客户需要的的电压数
* @author ZHENGWEI
* @date Jul 30, 2015
*/
public interface Target220V {
/**
* 不管多少伏的电压,经过转换后输出的就是220V
* @param v 原来的电压数
*/
public void convert220V(int v);
}
具体实现类(注意这个类可以不写)具体等一会儿再说
package com.adapt.target.impl;
import com.adapt.target.Target220V;
/**
* 这是转换电压的具体实现类,也即,适配器的具体转换操作的类
* @author ZHENGWEI
* @date Jul 30, 2015
*/
public class ConcreteTarget220V implements Target220V {
/**
* 不管多少伏的电压,经过转换后输出的就是220V
* @param v 原来的电压数
*/
public void convert220V(int v) {
System.out.println("原来的电压是:"+v+"伏");
System.out.println("现在正在进行电压转换");
System.out.println("现在的电压变成了220V");
}
}
待适配的类
package com.adapt.adaptee;
/**
* 这个类代表原来固有的类,我们想使用这个类,但是却不符合我们的标准
* 那么我们就要用适配器来转换它
* @author ZHENGWEI
* @date Jul 30, 2015
*/
public class Adaptee110V {
/**
* 原来这个国家的电压
* @return
*/
public int YuanLaiDeDianYa(){
return 110;
}
}
这个是适配器类
在这里,这个方法可以替换之前那个可以不存在的类,他们的效果是一样的
package com.adapt.adapter;
import com.adapt.adaptee.Adaptee110V;
import com.adapt.target.Target220V;
import com.adapt.target.impl.ConcreteTarget220V;
/**
* 适配器类,可以想象成笔记本电脑电源线的那个黑色的方块
* @author ZHENGWEI
* @date Jul 30, 2015
*/
public class Adapter extends Adaptee110V implements Target220V{
/**
* 适配器的转化方法
*/
public void convert220V(int v) {
ConcreteTarget220V concreteTarget220V = new ConcreteTarget220V();
concreteTarget220V.convert220V(v);
}
}
最后来一个测试方法
package com.adapt.main;
import com.adapt.adaptee.Adaptee110V;
import com.adapt.adapter.Adapter;
public class AdaptMain {
public static void main(String[] args) {
Adaptee110V adaptee110V = new Adaptee110V();
System.out.println("原来这个国家的电压是:"+adaptee110V.YuanLaiDeDianYa()+"伏");
System.out.println("=============================================");
System.out.println("现在开始使用适配器");
System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
Adapter adapter = new Adapter();
adapter.convert220V(adaptee110V.YuanLaiDeDianYa());
}
}
然后是结果
注意:
适配器模式大部分时候并不适用于初期开发阶段,而是适用于后期维护增加新需求的阶段,它只在特定的场合下使用才能取得最大的效果,比如上边的例子,我们对于电压的问题,我们不可能要求那个国家把电压变成220v,也不可能去改装自己的手机去适应110v,这个时候就要一个折中的办法,即适配器模式。代码也是这样,如果两个类都不可以更改,那么我们就采用适配器模式,当有挽回的余地的时候,我们还是尽量考虑重构。