Framework中的适配器模式

有的时候我们需要将一套接口和另一套接口对接,这就需要用到适配器模式。
比如有一个鸭子接口:
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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值