【设计模式】适配器模式(包装器)

适配器模式

一概述

什么是适配器模式
  • 概念:将一个类的接口转换成客户希望的另一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
  • 其实适配器可以理解为某种协议,使两个不同的类之间可以通过这种协议合作来达到某种目的。
为什么使用适配器模式

举个例子:假如一个中国旅客去美国旅游,但是美国那边只有三头的插座,而中国旅客带的所有插头都是两头的,么办法用,怎么办。这时,就可以去购买一个中间过渡的转换头,这样就可以使用了。我们将中国旅客的两头插头看作是一个类,将美国的三头插座看作是另一个类,本来两个类是不能互相合作的,但是我们有了转换头这个中间的适配器类就可以相互合作了。

二 模式的结构与使用

结构
  • 目标:目标是一个接口,该接口是客户想使用的接口
  • 被适配者:该适配者是一个已经存在的接口或者抽象类,这个接口或抽象类需要适配
  • 适配器:适配器是一个类,该类实现了目标接口并包含被适配者的引用,即适配器的职责是对被试陪着接口(抽象类)与目标接口进行适配。
具体实现
  • 目标
/*
 * 目标,客户想用但是不能直接用
 */
public interface ThreeElectricOutlet {
	public abstract void out();
}

具体类

/*
 * 目标的具体实现
 */
public class USPeople implements ThreeElectricOutlet{

	@Override
	public void out() {
		System.out.println("美国本地人使用插头");
	}

}
  • 被适配者
/*
 * 被适配者,需要通过适配器后才能使用
 */
public interface TwoElectricOutlet {
	public abstract void out();
}

实现类

/*
 * 被适配者的具体实现
 */
public class CNPeople implements TwoElectricOutlet{
	
	@Override
	public void out() {
		
		System.out.println("中国旅客正常使用插头");
	}

}
  • 适配器
/*
 * 适配器,注意适配器需要实现目标接口
 */
public class Adapter implements ThreeElectricOutlet{
	//存放被适配者的引用
	private TwoElectricOutlet outlet;
	
	public Adapter(TwoElectricOutlet outlet) {
		this.outlet = outlet;
	}
	
	@Override
	public void out() {
		outlet.out();
	}

}

主函数

public class MainClass {
	public static void main(String[] args) {
		System.out.println("美国旅客入住");
		//不需要适配器可以直接使用
		ThreeElectricOutlet outlet = new USPeople();
		outlet.out();
		System.out.println("中国旅客入住");
		//需要通过适配器后使用
		TwoElectricOutlet out = new CNPeople();
		//通过适配器进行插头的转换
		Adapter outlet2 = new Adapter(out);
		outlet2.out();

	}

}

结果
【设计模式】适配器模式(包装器)_第1张图片

三 适配器模式的优点与适用情景

优点
  • 目标与被适配者是完全解耦关系
  • 适配器模式符合"开-闭原则",即当有一个实现被适配者接口的新类时,不需要改变适配器的代码就可以对新类进行适配。
适用情景

一个程序想使用已经存在的类,但是这个类实现的接口和当前程序所使用的接口不一致的时候。

四 适配器模式与装饰模式的对比

前面我也写了一个关于装饰模式的文章,在学习适配器模式的时候,我就有点对这两个模式混淆。所以把我的理解写在这里,装饰者模式是对一个具体的实现类的行为进行增强,但是类的本质却没有变。适配器模式确实通过适配器将一个接口或者类转换成另一个接口或者类。就拿上面的例子来说,如果适配器模式是将美国的插座变得能让中国的插头用,相当于将美国的插座转换成中国的插座,那么装饰模式就是中国的插座还是转换成中国的插座,只不过外面套了一层保护壳或者装饰壳。

以上就是我所学习的适配器模式,欢迎大家观看指正。

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