版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mgsky1/article/details/79885073
今天要介绍的模式是适配器模式,说起适配器,我想大家可能会很容易想到各种电源适配器。举一个比较形象的例子吧,比如苹果早期的充电器。
苹果做了一个很人性化的设计,它的充电头是可以换的
也就是说,假如我出国旅行,各国的标准电压是不同的,我不用更换充电器,只需要更换一个头就可以了。
上面可能有点扯远了啊!不过这个跟我们今天要谈的适配器模式息息相关。还是上面的场景,如果我不更换头,那我的电子设备是不是离开了China就不能使用了呢?其实,如果从适配器模式的设计角度看,苹果的充电器有两个适配器:
- 可更换的头:适配各个国家不同的电压
- 充电器本身:将各个不同的电压转换成设备可以接受的电压范围。
显然,适配器的核心在于转换。在开发中,如果一个较新的系统要复用较老系统的某一个功能,但是由于各种原因导致二者无法自然衔接。此时,就应该考虑适配器模式,通过适配器将二者融合。
适配器模式的定义为:
适配器模式,将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。——《大话设计模式》
其UML类图为:
图中这个Target是开发者所期待的接口,Adaptee是要准备复用的类。而适配器Adapter类通过在内部包装一个Adaptee对象,把源接口转换成目标接口。
将上面充电的例子转化成代码如下:
import java.util.*;
//电力类
abstract class Electricity
{
//输送电
public abstract double transmit();
}
//中国的电力
class ChinaElectricity extends Electricity
{
//中国标准电压
private float power = 220;
public double transmit(){return this.power;};
}
//日本的电力
class JapanElectricity extends Electricity
{
//日本标准电压
private float power = 110;
public double transmit(){return this.power;};
}
//设备类
class Device
{
private Adapter ad = new Adapter();//电源适配器
private double power = 5;//设备能接受的电压
//充电方法,在哪里充电
public void charge(String where)
{
ad.changeToDevicePower(where,power);
System.out.println("正在充电...");
}
}
//电源适配器类
class Adapter
{
private ChinaElectricity ce = new ChinaElectricity();
private JapanElectricity je = new JapanElectricity();
//转换电流
public void changeToDevicePower(String where,double devicePowe)
{
double power = 0;
if(where.equals("China"))
{
power = ce.transmit();
}
else if(where.equals("Japan"))
{
power = je.transmit();
}
System.out.println("将"+power+"V转换为设备可用电压"+devicePowe+"V");
}
}
public class Main
{
public static void main(String[] args)
{
Device d = new Device();
d.charge("China");
d.charge("Japan");
}
}
上述代码的UML图
运行效果如下:
上述充电器图片来自百度图片搜索。如果有错误的话还希望能在评论中指出,共同进步^_^