23种设计模式-适配器模式
适配器模式(Adapter Pattern)是一种常用的设计模式,它可以将不兼容的接口转换成可兼容的接口,使得原本不能一起工作的类可以协同工作。
在Java中,适配器模式一般有两种实现方式,即类适配器模式和对象适配器模式。下面我们来分别介绍这两种实现方式,并通过示例代码来说明它们的使用方法。
一、类适配器模式
类适配器模式使用继承来实现适配器功能。通过继承待适配类,并实现目标接口,将待适配类的接口转换为目标接口。
示例代码如下:
// 待适配类
public class Adaptee {public void specificRequest() {System.out.println("Adaptee specificRequest");}
}// 目标接口
public interface Target {public void request();
}// 适配器类
public class Adapter extends Adaptee implements Target {@Overridepublic void request() {specificRequest();}
}// 测试代码
public class Test {public static void main(String[] args) {Target target = new Adapter();target.request();}
}
在这个示例中,Adaptee是待适配的类,Target是目标接口,Adapter是适配器类,通过继承Adaptee类,并实现Target接口,将Adaptee类的接口转换为Target接口。
二、对象适配器模式
对象适配器模式使用组合来实现适配器功能。通过将待适配类的实例作为适配器类的一个成员变量,并实现目标接口,将待适配类的接口转换为目标接口。
示例代码如下:
// 待适配类
public class Adaptee {public void specificRequest() {System.out.println("Adaptee specificRequest");}
}// 目标接口
public interface Target {public void request();
}// 适配器类
public class Adapter implements Target {private Adaptee adaptee;public Adapter(Adaptee adaptee) {this.adaptee = adaptee;}@Overridepublic void request() {adaptee.specificRequest();}
}// 测试代码
public class Test {public static void main(String[] args) {Adaptee adaptee = new Adaptee();Target target = new Adapter(adaptee);target.request();}
}
在这个示例中,Adaptee是待适配的类,Target是目标接口,Adapter是适配器类,通过将Adaptee类的实例作为Adapter类的一个成员变量,并实现Target接口,将Adaptee类的接口转换为Target接口。
在Android开发中,适配器模式也有广泛的应用。比如,ListView和RecyclerView等控件都需要通过适配器来将数据绑定到视图上。
ListView的适配器通常使用ArrayAdapter、SimpleAdapter、BaseAdapter等来实现。其中,BaseAdapter是一个抽象类,需要继承并实现相关方法来完成适配器的功能。下面我们以BaseAdapter为例,来说明适配器模式在Android开发中的应用。
public class MyAdapter extends BaseAdapter {private List<String> mData; // 数据源private LayoutInflater mInflater;public MyAdapter(Context context, List<String> data) {mData = data;mInflater = LayoutInflater.from(context);}@Overridepublic int getCount() {return mData.size();}@Overridepublic Object getItem(int position) {return mData.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder;if (convertView == null) {convertView = mInflater.inflate(R.layout.item_layout, parent, false);holder = new ViewHolder();holder.tvTitle = (TextView) convertView.findViewById(R.id.tv_title);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}String item = (String) getItem(position);holder.tvTitle.setText(item);return convertView;}private static class ViewHolder {TextView tvTitle;}
}
在这个示例中,MyAdapter继承了BaseAdapter类,并实现了相关方法来完成适配器的功能。在getView方法中,我们使用了ViewHolder模式来优化ListView的性能。
适配器模式在Android开发中的应用还有很多,比如RecyclerView的适配器、FragmentPagerAdapter的适配器等等。使用适配器模式可以将不兼容的接口转换成可兼容的接口,使得我们可以更方便地使用各种组件,并且能够提高代码的可复用性和可维护性。