<设计模式6>适配器模式

来源:互联网 发布:淘宝打包员一天多少单 编辑:程序博客网 时间:2024/05/29 20:00

适配器在我们生活中其实很常见,顾名思义,就是让原本不适配的东西通过适配器达到适配的效果。这也就是适配器模式的意义。

适配器模式主要分三类:类的适配器模式、对象的适配器模式、接口的适配器模式。

这里我们用生活中的电压来举例。我们的标准电压是220v,然而现在我们的电器是180v,如何通过适配器来满足我们的需求呢?


角色:

Target:目标,也就是当前的对象(属性、方法等)

Current:要的到的对象

Adapter:适配器,使得当前获得的东西为我们要得到的东西

类的适配器模式:

1、创建接口ITarget

public interface ITarget {//当前得到的电压public void TargetVoltage();}
实现该接口

public class Target implements ITarget {public void TargetVoltage() {System.out.println("电器电压是180V,不能使用220V");}}


2、创建Current类,我们当前想要的东西

public class Current {public void getCurrent(){System.out.println("220V的标准电压");}}
3、适配器Adapter
/** * 类适配器,通过继承和实现接口来关联 * */public class ClassAdapter extends Current implements ITarget{public void TargetVoltage() {getCurrent();}}

很简单,这样就完成了,其思想就是通过继承和接口来实现关联,TargetVoltage中返回Current中我们需要的结果,这样就达到了适配器的效果,通过适配器我们调用TargetVoltage就会获得我们想要的结果。

结果测试:

<span style="font-weight: bold;"></span>//类适配器://没有适配之前Target target = new Target();target.TargetVoltage();//适配之后ClassAdapter classAdapter = new ClassAdapter();classAdapter.TargetVoltage();

结果:

电器电压是180V,不能使用220V
220V的标准电压


对象的适配器模式:

其他的都不需要变,我们只需要修改一下Adapter,类适配器是通过继承关系来进行关联的,而对象适配器则是通过委派关系来进行关联。

ObjectAdapter:

/** * 通过委派来进行关联 * */public class ObjectAdapter implements ITarget{private Current current;public ObjectAdapter(Current current){this.current = current;}public void TargetVoltage() {current.getCurrent();}}

测试:

//对象适配器ObjectAdapter objectAdapter = new ObjectAdapter(new Current());objectAdapter.TargetVoltage();

结果:

220V的标准电压


ObjectAdapter只是实现了Itarget接口,在接口的TargetVoltage方法返回Current的结果,这样也达到了适配目的。

接口的适配器模式:

接口的适配器模式适用于,当一个接口有很多方法,但是我们只需要实现其中某一个方法时,我们就可以使用该模式。

创建一个接口:

public interface IMethods {public void getA();public void getB();public void getC();}
然后写一个适配器Adapter来实现这个接口:

public class InterfaceAdapter implements IMethods{public void getA() {}public void getB() {}public void getC() {}}
这个Adapter我们什么都不用做,只需要实现即可。

这样我们如果只想要实现方法A,我们只需要写一个类继承InterfaceAdapter即可,就不需要实现所有方法了。

public class InterfaceAdapterRealize extends InterfaceAdapter{public void getA() {super.getA();System.out.println("只实现了A方法");}}

测试:

//接口适配器InterfaceAdapterRealize iar = new InterfaceAdapterRealize();iar.getA();iar.getB();iar.getC();

结果:
只实现了A方法


三种适配器模式基本讲完了,为了方便理解,再通过Android源码来进行对照。

Android的Adapter很常用。我们来看一下BaseAdapter源码:

public abstract class BaseAdapter implements ListAdapter, SpinnerAdapter {    private final DataSetObservable mDataSetObservable = new DataSetObservable();    public boolean hasStableIds() {        return false;    }        public void registerDataSetObserver(DataSetObserver observer) {        mDataSetObservable.registerObserver(observer);    }    public void unregisterDataSetObserver(DataSetObserver observer) {        mDataSetObservable.unregisterObserver(observer);    }        /**     * Notifies the attached observers that the underlying data has been changed     * and any View reflecting the data set should refresh itself.     */    public void notifyDataSetChanged() {        mDataSetObservable.notifyChanged();    }    /**     * Notifies the attached observers that the underlying data is no longer valid     * or available. Once invoked this adapter is no longer valid and should     * not report further data set changes.     */    public void notifyDataSetInvalidated() {        mDataSetObservable.notifyInvalidated();    }<span style="white-space:pre"></span>。。。。。。。。。。。。。。。。。。}

我们这边只关注重要的部分。


BaseAdapter实现了ListAdapter接口:

<span style="font-size:18px;">public interface ListAdapter extends Adapter {    public boolean areAllItemsEnabled();    boolean isEnabled(int position);}</span>

ListAdapter继承了另一个接口Adapter,我们看一下Adapter的部分方法:

public interface Adapter {    /**     * Register an observer that is called when changes happen to the data used by this adapter.     *     * @param observer the object that gets notified when the data set changes.     */    void registerDataSetObserver(DataSetObserver observer);    /**     * Unregister an observer that has previously been registered with this     * adapter via {@link #registerDataSetObserver}.     *     * @param observer the object to unregister.     */    void unregisterDataSetObserver(DataSetObserver observer);。。。。。。。。。。。。。。。。。。。。。。。。}
Adpter中有两个方法:

void registerDataSetObserver(DataSetObserver observer);

void unregisterDataSetObserver(DataSetObserver observer);

再回过头去看BaseAdapter对这两个方法的实现:

    public void registerDataSetObserver(DataSetObserver observer) {        <span style="color:#ff0000;">mDataSetObservable.registerObserver(observer);</span>    }    public void unregisterDataSetObserver(DataSetObserver observer) {       <span style="color:#ff0000;"> mDataSetObservable.unregisterObserver(observer);</span>    }

很明显,这里便是适配器模式的典型使用,对象的适配器模式。


当我们调用BaseAdapter的registerDataSetObserver方法时,返回的是DataSetObservable的registerObserver方法,这样就达到了适配的目的。

0 0