<设计模式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方法,这样就达到了适配的目的。
- 设计模式(6)---->适配器模式
- <设计模式6>适配器模式
- 设计模式6-适配器模式
- 设计模式:适配器模式
- 设计模式------适配器模式
- 设计模式:适配器模式
- 设计模式---适配器模式
- 设计模式 适配器模式
- 设计模式 - 适配器模式
- 设计模式--适配器模式
- 设计模式-适配器模式
- 设计模式------适配器模式
- 设计模式---适配器模式
- 设计模式- 适配器模式
- 设计模式 - 适配器模式
- 设计模式:适配器模式
- 适配器模式--设计模式
- 设计模式 - 适配器模式
- 小tips:使用浮动后,要清除。
- 题目11 奇偶数分离
- MFC 按回车键移动光标到下一个文本框
- Android中关于图片压缩的小结
- 进入Material Design时代
- <设计模式6>适配器模式
- 分析Android-Universal-Image-Loader的缓存处理机制
- 线性插值和双线性插值
- SimpleDateFormat的简单使用
- 仿ios右滑销毁activity
- 哈佛图书馆励志名言
- R在浮点运算中的精度问题
- Delphi 停靠技术的应用3(两个窗体停靠成PageControl样式, 分页停靠)
- zookeeper知识点三(判断节点是否存在)