设计模式——之适配器模式

原来做安卓项目中,遇到了各种各样的adapter,然后百度了一下adapter是适配器的意思,我们来思考一下什么是适配器。

在生活中,举一个例子,我们的笔记本电脑电源是三相的插头,但是我们只有一个二相插座的话该怎么办呢?这里就用到了适配器模式。同理,我们见什么人说什么话,翻译软件按照不同国籍翻译也是一种适配。

定义:适配器模式将一个类的接口,转换成客户期望的另一个接口。使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。

我们来看我们第一个例子,首先我们定义一个三相插座的接口:他有一个用三相接口充电的方法

public interface ThreePlugIf {

	//使用三相电流
	public void powerWithThree();
}


然后我们再定义一个二相插头:它有一个用二相接口充电的具体实现方法。

public class GBTwoPlugIf {

	//使用二相电流供电
	public void powerWithTwo(){
		System.out.println("使用二相电流供电");
	}
}

我们再定义一个笔记本电脑类,它需要用三相插头充电,所以需要在它的构造函数中传入一个三相的接口,而此时。我们只有一个二相插头,该怎么做呢?



public class NoteBook {

	private ThreePlugIf plug;
	public NoteBook(ThreePlugIf plug) {
		this.plug=plug;
	}
	
	//使用插座充电
	public void charge(){
		
		plug.powerWithThree();
	}
	public static void main(String[] args) {
		GBTwoPlugIf two=new GBTwoPlugIf();
		ThreePlugIf three=new TwoPlugAdapter(two);
		noteBook.charge();
	}
}

我们定义一个三相的适配器接口,采用组合的方式来实现一个适配二相插头的方法:

/**
 * 二相转三相的插座适配器
 * @author lemoon
 *
 */
public class TwoPlugAdapter implements ThreePlugIf {

	
	private GBTwoPlugIf plug;

	
	
	public TwoPlugAdapter(GBTwoPlugIf plug) {
		this.plug = plug;
	}



	@Override
	public void powerWithThree() {
		System.out.println("通过转化");
		plug.powerWithTwo();
	}

}

它通过继承ThreePlugIf来实现接口,同时它含有一个二相GBTwoPlugIf的实例变量,我们在接口的实现方法中调用变量的充电方法。即可完成适配的任务。对外暴露的它仍是一个ThreePlugIf的实现类。

接下来我们将它传给笔记本电脑类

	public static void main(String[] args) {
		GBTwoPlugIf two=new GBTwoPlugIf();
		ThreePlugIf three=new TwoPlugAdapter(two);
		NoteBook noteBook=new NoteBook(three);
		noteBook.charge();
		
	}
这样我们就完成了一个二相转三相的适配任务。

同样,我们还可以通过继承的写法来实现,它同时继承了GBTwoPlugIf并实现了ThreePlugIf接口

/*
 * 采用继承方式的插座适配器
 */
public class TwoPlugAdapterExtends extends GBTwoPlugIf implements ThreePlugIf {
	@Override
	public void powerWithThree() {
		System.out.print("借助继承适配器");
		this.powerWithTwo();

	}
	
	
}

1.组合:采用组合方式的适配器称为对象适配器。特点:把“被适配者”作为一个对象组合到适配器中, 以修改目标接口包装被适配者。

2.继承:采用继承的方式被称为类适配器。特点:通过多重继承不兼容接口,实现对目标接口的匹配,单一的为某个类实现适配。

适配器的作用

1.透明

通过适配器,客户端可以调用同一接口,因而对客户端来说是透明的,这样做更简单,更直接,更紧凑。

2.重用

复用了现存的类,解决了现存类和复用环境要求不一致的问题

3.低耦合

将目标类和适配者类解耦,通过引入一个适配器类重用现有的适配者类,而无需修改原有代码(遵循开闭原则)。


你可能感兴趣的:(设计模式)