适配器模式
Posted _Doing
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了适配器模式相关的知识,希望对你有一定的参考价值。
- 何时使用: 1、系统需要使用现有的类,而此类的接口不符合系统的需要。 2、想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口。 3、通过接口转换,将一个类插入另一个类系中。主要解决:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。主要解决在软件系统中,常常要将一些"现存的对象"放到新的环境中,而新环境要求的接口是现对象不能满足的。有动机地修改一个正常运行的系统的接口,这时应该考虑使用适配器模式。
- 如何解决:类适配器模式:继承,对象适配器模式(推荐):依赖注入 / 代理。适配器继承或依赖已有的对象,实现想要的目标接口。
- 优点: 1、可以让任何两个没有关联的类一起运行。 2、提高了类的复用。 3、增加了类的透明度。 4、灵活性好。
- 缺点: 1、过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。 2.由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。
- 使用场景:1、JAVA 中的 jdbc。2、android的ListView的Adapter
- 注意事项:1、适配器不是在详细设计时添加的,而是解决正在服役的项目的问题。2、建议尽量使用对象适配器的实现方式,多用合成/聚合、少用继承。
类适配器模式
// Target角色,适配目标
public interface FiveVolt{
publicint getVolt5();
}
//Adaptee角色,需要被转换的对象
publicclassVolt220{
publicint getVolt220(){
return220;
}
}
// adapter角色
publicclassClassAdapter extends Volt220 implements FiveVolt{
@Override
publicint getVolt5(){
return5;
}
}
publicclassTest{
publicstaticvoid main(String[] args){
ClassAdapter adapter =newClassAdapter();
System.out.println("输出电压 : "+ adapter.getVolt5());
}
}
对象适配器模式
// Target角色,适配目标
public interface FiveVolt{
publicint getVolt5();
}
// Adaptee角色,需要被转换的对象
publicclassVolt220{
publicint getVolt220(){
return220;
}
}
// 对象适配器
publicclassObjectAdapter implements FiveVolt{
Volt220 mVolt220;
publicObjectAdapter(Volt220 adaptee){
mVolt220 = adaptee;
}
publicint getVolt220(){
return mVolt220.getVolt220();
}
@Override
publicint getVolt5(){
return5;
}
}
publicclassTest{
publicstaticvoid main(String[] args){
ClassAdapter adapter =newClassAdapter();
System.out.println("输出电压 : "+ adapter.getVolt5());
}
}
ListView中的Adapter模式
ListView需要能够显示各式各样的视图,每个人需要的显示效果各不相同,显示的数据类型、数量等也千变万化。那么如何隔离这种变化尤为重要。Android的做法是增加一个Adapter层来应对变化,将ListView显示时需要的数据通过接口抽象到Adapter对象中,这样只要用户实现了Adapter的接口,ListView就可以从Adapter中的接口函数取得用户设定的显示效果、数量、数据来显示特定的Item View:
- 通过代理数据集来告知ListView数据的个数( getCount函数 )以及每个数据的类型( getItem函数 )。
- 最重要的是要解决Item View的输出,Item View千变万化,但终究它都是View类型,Adapter统一将Item View通过 getView函数 输出为View ,这样就很好的应对了Item View的可变性。
// 代码省略
ListView myListView =(ListView)findViewById(listview_id);
// 设置适配器
myListView.setAdapter(newMyAdapter(context, myDatas));
// 适配器
publicclassMyAdapter extends BaseAdapter{
privateLayoutInflater mInflater;
List<String> mDatas ;
publicMyAdapter(Context context,List<String> datas){
this.mInflater =LayoutInflater.from(context);
mDatas = datas ;
}
@Override
publicint getCount(){
return mDatas.size();
}
@Override
publicString getItem(int pos){
return mDatas.get(pos);
}
@Override
publiclong getItemId(int pos){
return pos;
}
// 解析、设置、缓存convertView以及相关内容
@Override
publicView getView(int position,View convertView,ViewGroup parent){
ViewHolder holder = null;
// Item View的复用
if(convertView == null){
holder =newViewHolder();
convertView = mInflater.inflate(R.layout.my_listview_item, null);
// 获取title
holder.title =(TextView)convertView.findViewById(R.id.title);
convertView.setTag(holder);
}else{
holder =(ViewHolder)convertView.getTag();
}
holder.title.setText(mDatas.get(position));
return convertView;
}
}
来源:Android源码之ListView的适配器模式:http://blog.csdn.net/bboyfeiyu/article/details/43950185
以上是关于适配器模式的主要内容,如果未能解决你的问题,请参考以下文章