设计模式(11)适配器模式(讲解+应用)

java 3 2016-02-29 13:03
女装

目录

  1. 适配器模式

  2. 为什么使用适配器模式?

  3. 适配器模式应用实例

适配器模式

说道适配器模式,大多数人肯定不会陌生,提及其英文名称,Adapter,搞过Android的一定会想到在对ListView进行填充的时候,我们所用到的setAdapter(),通过一个适配器来使得listview具有不同的形式,姿态。

适配器模式将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。

概念定义表明,适配器模式就是当前我们的接口是不符合我们使用要求的,我们通过适配器模式将其转化,即为将一个接口转化为另一个接口,然后再使用。就好比,我们在给手机充电的时候,我们直接将usb线插进插座里,肯定是不可以的,我们需要将usb线先插入到一个适配器里,然后适配器插到插座上,我们才可以正常使用。这个概念理解起来还是相对比较简单的。

为什么使用适配器模式?

适配器是用来将将现有不适配接口转化为适配的接口,供给当下使用。借助之前的一个机器生产问题来举例,我们在机器生产后,进行销售的时候要进行以此包装,为了降低商店和具体机器的耦合,我们通过一个工厂模式来解决这个问题,实现一个依赖倒置,现在又有一个问题,出现了,我们的商店现在要出售一种在本商店一直没有出售过的机器,该机器的由于之前一直是在其它的商店销售,虽然其生产流程类似,但是其销售前的包装方式是不同的,现在转到我们的商店来,我们就有点犯愁了,我们不可能为了这一件产品而重新写代码之前的代码,但是该件商品还是要出售,我们可能想到打开该件商品去修改,但是该商品还在另一家店出售,有没有不用修改代码的方式呢?适配器就是来解决这个问题的,适配器可以出来大显身手了。
之前我们的代码是这样的。

public class Store{

    Store(){
        MachineFactory factory = new MachineFactory();
    }

    public void order(String type){
         Machine machine= factory.create(type);
        machine.firstPack();
        machine.secondPack();
        machine.thirdPack();
        machine.fourthPack();
    }
}

我们商店引入的新机器是这样的

public class InflatableDoll extends Machine{

    public void onePack(){
        System.out.prinltn("Add first pack to protect");
    }

    public void twoPack(){
        System.out.prinltn("Add second pack to protect");
    }

    public void threePack(){
        System.out.prinltn("Add third pack to protect");
    }

    public void fourPack(){
        System.out.prinltn("Add fourth pack to protect");
    }
}

适配器大显身手

public class InflatableDollAdapter extends Machine{

    InflatableDoll doll;

    MachineAdapter(InflatableDoll doll){
        this.doll = doll;
    }

     public void firstPack(){
         doll.onePack();
    }

    public void secondPack(){
        doll.twoPack();
    }

    public void thirdPack(){
        doll.threePack();
    }

    public void fourthPack(){
        doll.fourPack();
    }
}

商店中的order方法可以这样来写

 public void order(String type){
        Machine machine;
        if(type=="InflatableDoll")
            machine = InflatabelDollAdapter(factory.create(type));
        else
            machine=factory.create(type);
        machine.firstPack();
        machine.secondPack();
        machine.thirdPack();
        machine.fourthPack();
    }

不适配的问题解决了,适配器类将原有的类包起来,通过委托来实现功能的适配。这个例子不是很好,因这样如果后来需要适配的类持续增多,这个将变得很臃肿,这里主要借助这个例子方便大家理解这个适配器的这个实现过程。

适配器应用实例

上面提到Android中的listview,因为不同的Listview所要呈现的视图也是不同的,为了应对这种变化,就通过一个适配器来将这种变化和我们的ListView实现一个隔离和适配。我们可以通过一个继承自BaseAdapter类来实现自己的适配器,来将我们对ListView中的每一个item视图的配置。

下篇更新迭代器模式

女装
文章评论