作为一个准IT人员,小胖对自己的“武器”电脑烦恼过,小胖从大学开始用的电脑都是家里的,没有真正买过,第一个是他爸用来办公的联想G系列,属于比较老的款式,玩CF可以召唤N多个任务管理器(单例模式表示很捉急)第二个电脑是他姐姐的联想Y450,总体来说还算不错,还是珍藏版的呢!现在的电脑还是他爸爸办公的电脑联想E49,性能算是又进了一个层次吧,但是小胖想拥有一台mac,那多有面子!但是他在网上也百度了苹果电脑的兼容性,好多软件不支持苹果电脑的,就连存贮器都不行。。。这一点令小胖很纠结,也就是说,假如买了mac,也不能用来做开发,要不然就不用IOS,安装Microsoft,这不是坑爹的吗?
小胖想了想存贮器,两者有什么不同呢?要是不同的话,应该有适配器吧!转换一下不就行了吗?
适配器模式
解释:
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。——Gang of Four
最通俗的说法就是变压器,电是从发电厂传过来的,你不可能直接使用,必须使用变压器将电压转换成适当的电压,这样才能使用,否则你会变成焦炭!这个模式理解相对简单,看类图:
拿存储器来举例,现在最流行的存储器都包含两个方法,就是Read()读数据和Wirte()写数据,一般的U盘硬盘和多媒体设备都包含这两个方法,可以这样说,在它们被生产出来之前,它们的蓝图是实现Storage这个接口,然后实现Storage里的所有方法(read、write),这样的存储设备可以应用在各个电脑上,不需要什么适配器,但是突然苹果公司生产出来一个特殊的存储器mac,他们就是有“创新”,知道我们用的存储器是什么样子的,但就是不按套路走,偏偏生产包含pull和push方法的存储器,虽说是这样,但是买的人还是特别多,有句话说的好“只买最贵不买最好!”
苹果公司不可能让你买来用不了啊,所以随机生产了相应的适配器Adapter,你只有买了这个适配器才能使用,嘿,又大赚了一笔!
这个Adapter首先是继承Storage这个类,里面理所当然的包含了两个方法Read()和Write(),当然了,它也继承了mac这个存储器,这样才能将读写方法一一对应,一一转换,代码实现为:
public interface Storage {
public void Read();
public void Write();
}
public class FlashDisk implements Storage {
@Override
public void Read() {
System.out.println("我在读数据");
}
@Override
public void Write() {
System.out.println("我在写数据");
}
}
public class Mac {
public void Push(){
System.out.println("我在推送数据");
}
public void Pull(){
System.out.println("我在拉数据");
}
}
public class Adapter extends Mac implements Storage {
@Override
public void Read() {
super.Pull();
}
@Override
public void Write() {
super.Push();
}
}
public class test {
public static void main(String[] args) {
Storage sa = new FlashDisk();
sa.Read();
sa.Write();
Storage sb = new Adapter();
sb.Read();
sb.Write();
}
}
结果为:
<pre name="code" class="plain">我在读数据
我在写数据
我在拉数据
我在推送数据
这样就是适配器的面向类的适配器,继承了源类,并实现了目标接口,也就是一对一的写法,还有一种面向对象的适配器,看图:
这里需要注意Adapter和mac,此时是关联关系,并不是继承的关系了
相应的代码为:
public class Adapter implements Storage {
Mac mac;
public Adapter(Mac mac){
this.mac = mac;
}
@Override
public void Read() {
mac.Pull();
}
@Override
public void Write() {
mac.Push();
}
}
public class test {
public static void main(String[] args) {
Storage sa = new FlashDisk();
sa.Read();
sa.Write();
//初始化适配器
Adapter adapter = new Adapter(new Mac());
adapter.Read();
adapter.Write();
}
}
结果和上面是一样的!
对象适配器模式的效果
1)一个适配器可以把多种不同的源适配到同一个目标,换言之,同一个适配器可以把源类和它的子类都适配到目标接口。
2)与类的适配器模式相比,要想置换源类的方法就不容易。如果一定要置换掉源类的一个或多个方法,就只好先做一个源
类的子类,将源类的方法置换掉,然后再把原来的子类当做真正的源进行适配。
3)虽然要想置换源类的方法不容易,但是要想增加一些新的方法则方便的很,而且新增加的方法可同时适用于所有的源。
可见,对象适配器较类适配器更灵活,建议使用!