Android开发设计模式之——适配者模式

适配者模式是也是android中应用很广泛的设计模式,如我们常见用 BaseAdpter, ArrayAdapter, CursorAdapter,就是用的适配者模式,看到源码你是不是对这种设计方式很陌生,没事,下面我们通过实际的例子来取理解这种设计模式。

一、作用

适配器模式(Adapter):将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

二、适用场景

1. 业务的接口与工作的类不兼容,(比如:类中缺少实现接口的某些方法)但又需要两者一起工作

2. 在现有接口和类的基础上为新的业务需求提供接口

三、常见的使用方式

还是以Usb接口和Phone手机类的产品举例子,假设设计的Phone类中有 call(), sms(), takeAlong()属性方法,而在设计Usb接口时定义了 store(), takeAlong()的行为。如果现在有新的业务需求,需要生成 Xiaomi手机类具有 Phone类和Usb接口两者功能,假设Phone类和Usb接口已经在业务上投入使用,很显然,去修改原类中的方法和接口的行为去满足现在的新业务需求是不可取的,那么现在适配者模式就派上用场了。

(1)类适配模式

大致的意思是新的业务类Xiaomi通过继承旧业务的类Phone并实现接口Usb来满足新的业务的一种适配方式,如下图

Usb接口

public interface Usb {

    void store();

    void takeAlong();
}
Phone类
public class Phone {

    public void call() {
        System.out.println("Phone call");
    }

    public void sms() {
        System.out.println("Phone sms");
    }

    public void takeAlong() {
        System.out.println("Phone takeAlong");
    }
}
适配 Xiaomi 类
/**
 * 类的适配器模式
 * phone + Usb
 * 将Phone的功能扩展到Usb里
 * @author xuzhaohu
 * 
 */
public class Xiaomi extends Phone implements Usb {

    @Override
    public void store() {
        // TODO Auto-generated method stub
        System.out.println("store implements usb");
    }

}

适配完后使用

        Xiaomi mi1 = new Xiaomi();
        mi1.takeAlong();
        mi1.store();
输出:

Phone takeAlong
store implements usb

这样新的业务需求就可以通过适配的 Xiaomi类去满足了。是不是觉得很简单呢!!:)  有没有其他的方式去实现同样的功能呢?当然有,就是下面要讲的对象适配模式。

(2)对象适配模式

实现的方式很简单,其实就是在适配的时候通过构造函数将旧的业务Phone 当作新的适配类(XiaomiWrapper)一个成员对象去处理,然后适配类只需要实现接口 Usb即可。如下类关系图

适配类XiaomiWrapper如下,注意takeAlong()方法,是直接调用原类对象(Phone)去执行的。

/**
 * 对象的适配器模式
 * 
 * @author xuzhaohu
 * 
 */
public class XiaomiWrapper implements Usb {

    /**
     * 1.创建一个Wrapper类,持有原类的一个实例,
     * 2.在Wrapper类的方法中,调用实例的方法就行
     */
    private Phone phone;

    public XiaomiWrapper(Phone phone) {

        this.phone = phone;
    }

    @Override
    public void store() {
        // TODO Auto-generated method stub
        System.out.println("store implements usb");

    }

    @Override
    public void takeAlong() {
        // TODO Auto-generated method stub
        phone.takeAlong();
    }

}
适配完后通过构造函数将原对象传入即可。
        XiaomiWrapper mi2 = new XiaomiWrapper(new Phone());
        mi2.takeAlong();
        mi2.store();
输出:

Phone takeAlong
store implements usb

或许到这里,你会觉得这种方式很简单吧。但是如果出现这个Usb接口中有很多方法(大于2个),但是新的业务需求中也只需要其中的一两个,而且是需要适配很多这样的业务,这样的话,用上面的方法每次适配一次就会去实现所有Usb接口中的方法,实际上适配的类中有很多是用不到的,没有必要把接口中不使用的类也适配进去,这时候,就轮到下面的接口适配模式出场了。

(3)接口适配模式

适配新的业务需求的时候借助抽象实现类(AbsPhone实现Usb接口),也就说,抽象实现类把Usb接口中的行为都实现了,新的适配是需要跟抽象类对话就行,因为抽象实现类就能满足了所有适配的需求,并且做到了只适配业务本身的行为,接口中不需要的行为我根本不需要关注。这就是抽象实现类的作用。类图关系如下:


抽象类AbsPhone实现

/**
 * 接口的适配器模式
 * 1.借助于一个抽象类,该抽象类实现了该接口,实现了所有的方法
 * 2.继承类可以选择性的实现接口中的方法
 * 
 * @author xuzhaohu
 * 
 */
public abstract class AbsPhone implements Usb {

    public void store() {
        System.out.println("AbsPhone implements usb's store methond");
    }

    public void takeAlong() {
        System.out.println("AbsPhone implements usb's takeAlong methond");
    }
}
适配类只跟AbsPhone打交道,根本不需要关心接口的行为,只显示自己所要关注的。

如Phone1适配只需要store()行为

public class Phone1 extends AbsPhone {

    public void call() {
        System.out.println("Phone1 call");
    }
    
    public void sms() {
        System.out.println("Phone1 sms");
    }

    public void store() {
        System.out.println("Phone1 need usb's store methond");
    }

}
Phone2适配只需要takeAlong()行为

public class Phone2 extends AbsPhone {

    public void call() {
        System.out.println("Phone2 call");
    }

    public void sms() {
        System.out.println("Phone2 sms");
    }

    public void takeAlong() {
        System.out.println("Phone2 need usb's takeAlong methond");
    }

}
实例化调用
        Phone1 p1 = new Phone1();
        Phone2 p2 = new Phone2();
        p1.store();
        p2.takeAlong();
输出:

Phone1 need usb's store methond
Phone2 need usb's takeAlong methond

来一次完整的调用

        Phone1 p1 = new Phone1();
        Phone2 p2 = new Phone2();
        p1.store();
        p1.takeAlong();
        p2.takeAlong();
        p2.store();
输出:

Phone1 need usb's store methond
AbsPhone implements usb's takeAlong methond
Phone2 need usb's takeAlong methond
AbsPhone implements usb's store methond

这样很清晰的知道适配的什么方法了。


总结:适配者模式在android源码中有很多这样的体现,大家看完这个再去看源码,是不是会感觉看懂了不少呢?


参考:http://zz563143188.iteye.com/blog/1847029

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android设计模式是在Android应用程序开发中常用的一些软件设计模式的应用集合。这些设计模式可以帮助开发者解决一些常见的问题,提高代码的可维护性、可扩展性和可重用性。 以下是一些常见的Android设计模式: 1. MVC(Model-View-Controller)模式:将应用程序分为模型、视图和控制器三个部分,实现了业务逻辑和界面的分离。模型负责数据的处理和存储,视图负责展示界面,控制器负责处理用户的输入和业务逻辑的处理。 2. MVP(Model-View-Presenter)模式:在MVC模式的基础上,将控制器改为Presenter,负责处理视图和模型之间的交互。Presenter通过接口与视图进行通信,将视图的操作转发给模型进行处理。 3. MVVM(Model-View-ViewModel)模式:在MVP模式的基础上,引入了ViewModel层,负责处理视图和模型之间的数据绑定。ViewModel将模型的数据转换为视图所需的数据,并通过数据绑定机制将其绑定到视图上。 4. 单例模式:确保一个类只有一个实例,并提供一个全局的访问点。在Android开发中,常用于管理全局的资源或状态,例如Application类。 5. 观察者模式:定义了对象之间的一对多依赖关系,当一个对象的状态发生变化时,所有依赖它的对象都会收到通知并自动更新。在Android开发中,常用于实现事件的发布和订阅机制。 6. 适配模式:将一个类的接口转换成客户端所期望的另一个接口。在Android开发中,常用于将不同的组件或类适配成统一的接口,例如RecyclerView的Adapter。 这些设计模式可以根据具体的需求和场景进行选择和组合使用,以提高代码的质量和开发效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值