Framework中的适配器模式

来源:互联网 发布:陕汽重卡软件 编辑:程序博客网 时间:2024/05/01 06:12
有的时候我们需要将一套接口和另一套接口对接,这就需要用到适配器模式。
比如有一个鸭子接口:
package com.amaker.app;

public interface Duck {
 
   public voidquack();
    public voidfly();
}
然后绿头鸭是鸭子的子类:
package com.amaker.app;

public class MallardDuck implements Duck {

   @Override
    public voidquack() {
       // TODOAuto-generated method stub
      System.out.println("Quack");
    }

   @Override
    public voidfly() {
       // TODOAuto-generated method stub
      System.out.println("I'm flying");
    }

}
另外类禽类叫“街头顽禽”大火鸡
public interface Turkey{
public void gobble();
public void fly();
}
火鸡的一个具体实现:
package com.amaker.app;

public class WildTurkey implements Turkey {

   @Override
    public voidgobble() {
       // TODOAuto-generated method stub
      System.out.println("Gobble gobble");
    }

   @Override
    public voidfly() {
       // TODOAuto-generated method stub
      System.out.println("I'm flying a short distance");
    }
}
现在这里就有了两套接口,而现在如果我们缺鸭子对象,想用火鸡对象来冒充的话怎么办呢?我们就可以写一个适配器。
1.首先需要实现想转换成的类型接口,这里就是鸭子了。
2.然后需要取得适配的对象的引用,这里通过构造器获取。
3.然后实现接口中的所有方法,这里鸭子的接口里实现火鸡的行为。
package com.amaker.app;

public class TurkeyAdapter implements Duck {
    Turkeyturkey;
    publicTurkeyAdapter(Turkey turkey) {
      super();
       this.turkey= turkey;
    }

   @Override
    public voidquack() {
       // TODOAuto-generated method stub
      turkey.gobble();
    }

   @Override
    public voidfly() {
       // TODOAuto-generated method stub
       for(int i =0 ; i < 5 ; i ++)
       {
         turkey.fly();
       }
    }
}
然后我们写一个测试方法:
package com.amaker.app;

public class DuckTestDrive {

   
    publicstatic void main(String[] args) {
       // TODOAuto-generated method stub
       MallardDuckduck = new MallardDuck();
       WildTurkeyturkey = new WildTurkey();
       DuckturkeyAdapter = new TurkeyAdapter(turkey);
      
      System.out.println("The Turkey says...");
      turkey.gobble();
      turkey.fly();
      
      System.out.println("\nThe Duck says...");
      testDuck(duck);
      
      System.out.println("\nThe TurkeyAdapter says...");
      testDuck(turkeyAdapter);
    }
    static voidtestDuck(Duck duck){
      duck.quack();
      duck.fly();
    }
}
上面就是一个适配器的实现。
//---------------------------------------------------------------------------------------------------------------------------------------------------
//在Framework中
有一个FactoryAdapter
public class FactoryMenuAdapter {


//函数都是像下面getProjectID()这样的
/**
     * return the project id of system
     *
     * @param null
     * @return project id
     */
    public int getProjectID() {
        int ret = 0;
        try {
            ret = mService.getProjectID();
        } catch (RemoteException e) {
            e.printStackTrace();
        }
        return ret;
    }
}
这样APK调用FactoryAdapter的接口就是了(当然了FactoryAdapter的设计采用单例模式)
mFactoryAdapter = FactoryMenuAdapter.getInstance(mContext_);
int projectID = mFactoryAdapter.getProjectID();

有Adapter这个适配器来封装FacService的一系列接口。这样子,就可以用这个Adapter在把APK和FacService的耦合性降低的同时把两套接口连接起来,apk中看到的只是FactoryAdapter中的那套接口,可以避免下层接口的直接暴露。
0 0