适配器的定义
在设计模式中,适配器模式(英语:adapter pattern)有时候也称包装样式或者包装(wrapper)。将一个类的接口转接成用户所期待的。一个适配使得因接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。
适配器的种类
对象适配器模式
用一个具体的Adapter类对Adaptee和Target进行匹配。结果是当我们想要匹配一个类以及所有它的子类时,类Adapter将不能胜任工作。
类适配器模式
允许一个Adapter与多个Adaptee—即Adaptee本身以及它的所有子类(如果有子类的话)—同时工作。Adapter也可以一次给所有的Adaptee添加功能。
结构
目标角色(Target):— 定义Client使用的与特定领域相关的接口。
客户角色(Client):与符合Target接口的对象协同。
被适配橘色(Adaptee):定义一个已经存在并已经使用的接口,这个接口需要适配。
适配器角色(Adapte) :适配器模式的核心。它将对被适配Adaptee角色已有的接口转换为目标角色Target匹配的接口。对Adaptee的接口与Target接口进行适配.
适配器的在生活中的应用
1.电视接口可以接受不同的音质,能够匹配不同的放映机,原来是DVD的机子,后来结成adapter之后可以匹配CD的放映,只要更改适配的代码,而不用修改全部
2.电脑pc的接口,可以插U盘和连接手机,还可以连接充电,这就是在原有的传输数据的基础上,适配充电的功能,然后可以重载不同的方法接口,连接不同的终端接口,在还可以连接打印机等其他的设备,这根据适配器,能够减少依赖,降低耦合度,便于开发和维护
适配器模式使用注意事项
充当适配器角色的类就是:实现已有接口的抽象类;
为什么要用抽象类?此类是不要被实例化的。而只充当适配器的角色,也就为其子类提供了一个共同的接口,但其子类又可以将精力只集中在其感兴趣的地方。
适配器模式中被适配的接口 Adaptee 和适配成为的接口 Target 是没有关联的,Adaptee 和 Target 中的方法既可以是相同的,也可以是不同的。
适配器在适配的时候,可以适配多个 Apaptee,也就是说实现某个新的 Target 的功能的时候,需要调用多个模块的功能,适配多个模块的功能才能满足新接口的要求。
适配器有一个潜在的问题,就是被适配的对象不再兼容 Adaptee 的接口,因为适配器只是实现了 Target 的接口。这导致并不是所有 Adaptee 对象可以被使用的地方都能是使用适配器,双向适配器解决了这个问题
代码实现
package adaptertest;
public interface Duck {
public void quack();
public void fly();
}
实现接口
package adaptertest;
public class MallardDuck implements Duck {
@Override
public void quack() {
// TODO Auto-generated method stub
System.out.println("Quack");
}
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("I am flying");
}
}
package adaptertest;
public interface Turkey {
public void gobble();
public void fly();
}
package adaptertest;
public class WildTurkey implements Turkey{
@Override
public void gobble() {
// TODO Auto-generated method stub
System.out.println("Gobble gobble");
}
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("I am flying a short distance");
}
}
实现
package adaptertest;
public class WildTurkey implements Turkey{
@Override
public void gobble() {
// TODO Auto-generated method stub
System.out.println("Gobble gobble");
}
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("I am flying a short distance");
}
}
适配器实现
package adaptertest;
public class TurkeyAdapter implements Duck {
Turkey turkey;
public TurkeyAdapter(Turkey turkey) {
super();
this.turkey = turkey;
}
@Override
public void quack() {
// TODO Auto-generated method stub
turkey.gobble();
}
@Override
public void fly() {
// TODO Auto-generated method stub
for(int i=0;i<5;i++) {
turkey.fly();
}
}
}
测试
package adaptertest;
public class DuckTestDrive {
public static void main(String[] args) {
MallardDuck duck=new MallardDuck();
WildTurkey turkey=new WildTurkey();
Duck turkeyAdapter=new TurkeyAdapter(turkey);
System.out.println("the Turkey says...");
turkey.gobble();
turkey.fly();
System.out.println("\n The Duck says...");
testDuck(duck);
System.out.println("\n The TurkeyAdapter says...");
testDuck(turkeyAdapter);
}
private static void testDuck(Duck duck) {
// TODO Auto-generated method stub
duck.fly();
duck.quack();
}
}
结果:
the Turkey says…
Gobble gobble
I am flying a short distance
The Duck says…
I am flying
Quack
The TurkeyAdapter says…
I am flying a short distance
I am flying a short distance
I am flying a short distance
I am flying a short distance
I am flying a short distance
Gobble gobble
总结
通过本模式,可以锻炼一种解决方法的途径,不用一直死坑到底,当遇到困难时候,换一个方法去接应原来的方法估计更加完美,就像你要画一个圆,直接画的画你捉不住方向,这时候你可以像画一个正方形,然后慢慢的去掉四个边,然后慢慢磨平棱角,这样你的把握会更加的完美,这就是学习和生活的区别吧,不过学习的模式就是生活方法和经验的总结。加油,GO