我选择分析的设计模式是“适配器模式(Adapter Pattern)”
应用的场景是:1.业务的接口与工作的类不兼容,(比如:类中缺少实现接口的某些方法)但又需要两者一起工作;2. 在现有接口和类的基础上为新的业务需求提供接口。
一、简单介绍
适配器模式(Adapter Pattern)就是把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口原因不匹配而无法一起工作的两个类能够一起工作。适配类可以根据参数返还一个合适的实例给客户端。
二、适配器模式的结构
适配器模式分为类适配器模式和对象适配器模式。关于类适配模式,因为java的单继承,所以在已继承一个类时,另外的只能是接口,需要手动实现相应的方法,这样在客户端就可以创建任一种符合需求的子类,来实现具体功能。而另外一种对象适配器,它不是使用继承再实现的方式,而是使用直接关联,或者称为委托的方式。我们生活中常常听到的是:
电源适配器,它是用于电流变换(整流)的设备。适配器的存在,就是为了将已存在的东西(接口)转换成适合我们的需要、能被我们所利用。在现实生活中,适配器更多的是作为一个中间层来实现这种转换作用。在上面的通用类图中,Cient 类最终面对的是 Target 接口(或抽象类),它只能够使用符合这一目标标准的子类;而 Adaptee 类则是被适配的对象(也称 源角色),因为它包含specific (特殊的)操作、功能等,所以我们想要在自己的系统中使用它,将其转换成符合我们标准的类,使得 Client 类可以在透明的情况下任意选择使用 ConcreteTarget 类或是具有特殊功能的 Adatee 类。
代码实现如下:
// 已存在的、具有特殊功能、但不符合我们既有的标准接口的类 class Adaptee { public void specificRequest() { System.out.println("被适配类具有 特殊功能..."); } } // 目标接口,或称为标准接口 interface Target { public void request(); } // 具体目标类,只提供普通功能 class ConcreteTarget implements Target { public void request() { System.out.println("普通类 具有 普通功能..."); } } // 适配器类,继承了被适配类,同时实现标准接口 class Adapter extends Adaptee implements Target{ public void request() { super.specificRequest(); } } // 测试类 public class Client { public static void main(String[] args) { // 使用普通功能类 Target concreteTarget = new ConcreteTarget(); concreteTarget.request(); // 使用特殊功能类,即适配类 Target adapter = new Adapter(); adapter.request(); } }
测试结果:
上面这种实现的适配器称为类适配器,因为 Adapter 类既继承了 Adaptee (被适配类),也实现了 Target 接口(因为 Java 不支持多继承,所以这样来实现),在 Client 类中我们可以根据需要选择并创建任一种符合需求的子类,来实现具体功能。另外一种适配器模式是对象适配器,它不是使用多继承或继承再实现的方式,而是使用直接关联,或者称为委托的方式,类图如下:
// 适配器类,直接关联被适配类,同时实现标准接口 class Adapter implements Target{ // 直接关联被适配类 private Adaptee adaptee; // 可以通过构造函数传入具体需要适配的被适配类对象 public Adapter (Adaptee adaptee) { this.adaptee = adaptee; } public void request() { // 这里是使用委托的方式完成特殊功能 this.adaptee.specificRequest(); } } // 测试类 public class Client { public static void main(String[] args) { // 使用普通功能类 Target concreteTarget = new ConcreteTarget(); concreteTarget.request(); // 使用特殊功能类,即适配类, // 需要先创建一个被适配类的对象作为参数 Target adapter = new Adapter(new Adaptee()); adapter.request(); } }
测试结果与上面的一致。从类图中我们也知道需要修改的只不过就是 Adapter 类的内部结构,即 Adapter 自身必须先拥有一个被适配类的对象,再把具体的特殊功能委托给这个对象来实现。使用对象适配器模式,可以使得 Adapter 类(适配类)根据传入的 Adaptee 对象达到适配多个不同被适配类的功能,当然,此时我们可以为多个被适配类提取出一个接口或抽象类。这样看起来的话,似乎对象适配器模式更加灵活一点。
三、策略模式对系统架构和代码结构带来的好处
1、复用性好;
2、灵活性和扩展性好,符合开闭原则;
四、Demo(Android中适配器模式的应用)
ListView与Adapter的应用就是典型的适配器模式。最近在安卓的开发过程中刚好使用了这个控件
第一步:构建BaseAdapter抽象父类
public abstract class BaseAdapter { public String[] item; //ListView 中的子项Item public String[] getItem() { return item; } public void setItem(String[] item) { this.item = item; } }
第二步:定义ListView方法的接口IListView
public interface IListView { public void setAdapter(BaseAdapter adapter); }
第三步:ListView组件类 至此ListView组件已经成型,接下来完成适配器Adapter类
public class ListView extends BaseAdapter implements IListView{ @Override public void setAdapter(BaseAdapter adapter) { this.setItem(adapter.getItem()); } }
第四步:适配器接口IAdapt
public interface IAdapter { public void setData(); }
第五步:生成适配器SimpleAdapter
ListView listView=new ListView(); ArrayList> arrayList=new ArrayList >(); for(int i=0;i<10;i++){ HashMap map=new HashMap (); map.put("NAME", "Item"+i); arrayList.add(map); } SimpleAdapter adapter1=new SimpleAdapter(arrayList, "NAME"); listView.setAdapter(adapter1);
六、 适配器模式设计原则:
1.使用对象组合,面向接口和抽象编程
2.“开闭”原则