设计模式之适配器模式

现实需求:有两类对象数据ObjA,ObjB,ObjA来自实现了接口IA的类A,ObjB来自实现了接口IB的类B,结果现在要求把这两类数据存在一块(即来自同一类,有相同的方法)。

可是,ObjA源自接口IA,拥有自己的方法,ObjB同样。那如何实现两类对象数据又拥有相同的方法呢?适配器模式应运而生。


举例如下:学生Sjtuer到学校Xjtu做交换生,然后拿着自己在Sjtu的对象数据来到Xjtu上学,结果发现对象数据拥有的方法不同,那他的对象数据还能输入到Xjtu里吗?显然通过适配器模式可以实现,适配器模式分为两种——类适配器(继承类)和对象适配器(对象注入)。

ISjtuer接口:

package _8th_Adapter;

public interface ISjtuer {
	void Age();
	void Height();
}

Sjtuer实现:

public class Sjtuer implements ISjtuer {

	@Override
	public void Age() {
		System.out.println("sjtu学生年龄是?");
	}

	@Override
	public void Height() {
		System.out.println("sjtu学生身高是?");
	}

}

IXjtuer接口:

public interface IXjtuer {
	void getAge();
	void getHeight();
}


类适配器:

package _8th_Adapter;
/**
 * 类适配器——继承Sjtuser类。
 * 通过this调用父类Sjtuer中的Age(),Height()方法来实现getAge,getHeight方法,完成适配。。
 * @author Administrator
 *
 */
public class AdapterByClass extends Sjtuer implements IXjtuer {
	
	@Override
	public void getAge() {
		this.Age();//成功将Age方法转化为目标接口中的方法——getAge方法
	}

	@Override
	public void getHeight() {
		this.Height();//成功将Height方法转化为目标接口中的方法——getHeight方法
	}

}


对象适配器:

package _8th_Adapter;
/**
 * 对象适配器——通过注入Sjtuer类对象。
 * 通过注入的对象来调用Age和Height方法来实现getAge,getHeight方法,完成适配。
 * @author Administrator
 *
 */
public class AdapterByObject implements IXjtuer {
	ISjtuer sjtuer = null;
	public AdapterByObject(ISjtuer sjtuer) {
		this.sjtuer = sjtuer;
	}
	@Override
	public void getAge() {
		sjtuer.Age();
	}

	@Override
	public void getHeight() {
		sjtuer.Height();
	}

}

测试:

	public static void main(String[] args) {
		AdapterByClass adapter1 = new AdapterByClass();
		adapter1.getAge();
		AdapterByObject adapter2 = new AdapterByObject(new Sjtuer());
		adapter2.getHeight();
	}

其实,两个模式目的是一样的,都是为了能够在适配器类中调用需要兼容的接口的实现方法。一个通过继承,一个又一次使用了对象依赖注入(这个需要深刻理解,对你学习与编码会很有帮助)。


你可能感兴趣的:(设计模式,对象适配器模式,类适配器模式)