二、适配器模式
举个简单的例子,当我们给手机充电时,由于手机充电口是5V,而插座提供的是220V交流电,因此我们通常需要使用充电器将220V交流电转换成可供手机充电用的5V直流电,这个充电器就是一个适配器。
同样,在编写JAVA程序时,我们可能会遇到这样一种情况:我们需要一个类A来实现接口B,但是类A并没有实现接口B中的所有方法,而类A是不能被改变的,这时我们可以创建一个类C,它继承类A并实现接口B,这个类C就是一个适配器。适配器中的代码将接受你所拥有的接口,并产生你所需要的接口。适配器模式有两张:类适配器模式和对象适配器模式。下面用两个例子来简单演示一下:
1、类适配器模式:
package com.tongye.adapters;
public interface TargetInterface {
void method1();
void method2();
}
/*****************************/
package com.tongye.adapters;
/* 源类,我们需要这个类实现接口 TargetInterface,但这个类不能被改变
* 源类与接口之间是没有关系的
* */
class BeAdapted{
public void method1(){
System.out.println("method1");
}
}
/* 这是适配器,它接受了BeAdapted中已有的接口并产生我们需要的接口
* method1()方法继承自BeAdapted类(即已有的接口),不用再作声明
* 这里适配器的作用相当于为源类与接口之间建立了一种关系,类似于 implements
* */
class Adapter extends BeAdapted implements TargetInterface{
public void method2(){ // method2()方法无法通过继承获得,因而需要自己声明,这就是适配器为我们产生的接口
System.out.println("method2");
}
}
public class ClassAdapter {
public static void main(String[] args){
Adapter adapt = new Adapter();
adapt.method1();
adapt.method2();
}
}
Adapter与BeAdapted是继承关系,即为类适配器模式。
2、对象适配器模式:
package com.tongye.adapters;
public interface TargetInterface {
void method1();
void method2();
}
/*****************************/
package com.tongye.adapters;
/* 源类,我们需要这个类实现接口 TargetInterface,但这个类不能被改变
* 源类与接口之间是没有关系的
* */
class BeAdapted{
public void method1(){
System.out.println("method1");
}
}
/* 这是适配器,它接受了中已有的接口并产生我们需要的接口 */
class Adapter implements TargetInterface{
private static BeAdapted adapted; // 声明一个BeAdapted对象引用
public Adapter(BeAdapted adapted){ // 构造方法,接收一个BeAdapted引用作为参数
this.adapted = adapted;
}
public void method1(){ // method1()在源类BeAdapted中有,这里直接委派
this.adapted.method1();
}
public void method2(){ // method2()方法无法通过继承获得,需要自己声明
System.out.println("method2");
}
}
Adapter与BeAdapted是委托关系,即为对象适配器模式。
通过使用适配器模式,可以大大提升程序的灵活性以及代码的可重复性。