1. 现实生活中有很多原来的东西和目标的东西不匹配,但是你还要去用,那么这时候怎么办呢,就需要一个东西,是原来的东西能够被目标东西所使用,这就是适配器,也是体现它的价值的地方,例如两头插座和三孔插座,两头插头需要这个三孔插座变成两空插头从而能够使用,这时候来个转化器既可以使用了,这个转化器就是适配器,它能够实现三孔插座变成两孔从而能够使用。
2. 所以适配器涉及三个角色:
目标角色
源角色
适配器角色
3. 适配器让目标使用源的方法,所以需要实现目标接口,重构接口方法,调用源接口的方法(由于调用的方式不一样,分为:类适配(继承),对象适配(依赖组合))
4. 代码实现
源接口
package adaptmodel;public interface SourceInter { public void ThreeHoles();}
源实现类
package adaptmodel; public class ThreeHoles implements SourceInter { @Override public void ThreeHoles() { // TODO Auto-generated method stub System.out.println("使用三孔充电"); }}
目标接口
package adaptmodel; public interface TargetInter { public void TwoHead();}
目标实现类
package adaptmodel; public class Twoheads implements TargetInter { @Override public void TwoHead() { // TODO Auto-generated method stub System.out.println("用两头充电"); }}
类适配器
package adaptmodel;/** * 这里使用类适配器通过继承实现,但是这里没有对象适配器灵活 * @author Administrator * */public class Adapt2 extends ThreeHoles implements TargetInter { @Override public void TwoHead() { // TODO Auto-generated method stub super.ThreeHoles(); }}
对象适配器
package adaptmodel; /** * 适配器能够提供目标客户想要的接口,所以需要重构目标接口的方法, * 从而来调用源接口的方法(这里是对象适配器,优点:可以提供所接口以及子接口的重构的方法) * @author Administrator * */public class Adapt implements TargetInter { private SourceInter sourceInter; Adapt(SourceInter sourceInter){ this.sourceInter = sourceInter; } @Override public void TwoHead() { // TODO Auto-generated method stub sourceInter.ThreeHoles(); }}
测试
package adaptmodel; public class TestAdapt { public static void main(String[] args) { // TODO Auto-generated method stub /* * 这里其实目标和源不是直接打交道的,是adpat实现了源的功能,然后目标通过adapt使用源的功能 */ //使用has a的形式,对象适配器 TargetInter targetinter=new Adapt(new ThreeHoles()); targetinter.TwoHead(); //is a的形式 类适配器 TargetInter targetInter2=new Adapt2(); targetInter2.TwoHead(); }}
5. 可以看出适配器适合的场景
就是接口不一致,但是又想使用,
1) 现有系统和源系统接口不一致
2) 使用接口不一致的api
6. 适配器的缺点:
重新构建新的适配器比较麻烦
7. 实例:
.net dataAdap