适配器模式(Adapter)-结构型

意图

把一个类的接口转换成客户端所期望的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。

角色

目标接口(Target):我们所期望得到的接口。
适配源(Adaptee):需要被适配的接口。
适配器(Adapter):适配器把适配源的接口转换成目标接口。适配器必须是具体类。

适配器模式分类的适配器模式和对象的适配器模式两种不同的形式。

类的适配器模式

通过继承来将被适配的类的API转换成为目标类的API。

类图


实例

<span style="font-size:14px;">//适配源  
class DZManufacture {//生产发动机驱动汽车的大众制造商
	protected Car car;
	public DZManufacture(){
		car=new Car();
	}
	public void setEngine() {
		System.out.println("获取德国引擎");
		System.out.println("安装德国引擎");
		car.description=car.description+"引擎:德国造 ";
	}
	public void setWheel() {
		System.out.println("获取美国轮子");
		System.out.println("安装美国轮子");
		car.description=car.description+"轮胎:美国造 ";
	}
	public Car getCar() {
	    System.out.println("制造了一辆大众汽车");
		return car;
	}
}
class Car{
    public String description="";
}
//目标接口 
interface ManufactureFuture {//未来汽车改用电池驱动
	public void setBattery() ;
	public void setWheel() ; 
	public Car getCar() ;
}
//类的适配器模式(采用继承实现)
class DZManufactureFuture extends DZManufacture implements ManufactureFuture{
	@Override
	public void setBattery() {
		System.out.println("获取广州电池");
		System.out.println("安装广州电池");
		car.description=car.description+"电池:中国造 ";
	}
}</span>
<span style="font-size:14px;">//客户端代码
class test  {
	public static void main (String[] args) throws java.lang.Exception{
	    //旧的生产过程
	    DZManufacture manufacture=new DZManufacture();
	    manufacture.setEngine();
	    manufacture.setWheel();
	    Car dz=manufacture.getCar();
	    System.out.println(dz.description);
	    //新的生产过程
	    ManufactureFuture manu=new DZManufactureFuture();
	    manu.setBattery();
	    manu.setWheel();
	    Car car=manu.getCar();
	    System.out.println(car.description);
	}
}</span>

对象的适配器模式

类图


实例

<span style="font-size:14px;">//适配源  
class DZManufacture {//生产发动机驱动汽车的大众制造商
	protected Car car;
	public DZManufacture(){
		car=new Car();
	}
	public void setEngine() {
		System.out.println("获取德国引擎");
		System.out.println("安装德国引擎");
		car.description=car.description+"引擎:德国造 ";
	}
	public void setWheel() {
		System.out.println("获取美国轮子");
		System.out.println("安装美国轮子");
		car.description=car.description+"轮胎:美国造 ";
	}
	public Car getCar() {
	    System.out.println("制造了一辆大众汽车");
		return car;
	}
}
class Car{
    public String description="";
}
//目标接口 
interface ManufactureFuture {//未来汽车改用电池驱动
	public void setBattery() ;
	public void setWheel() ; 
	public Car getCar() ;
}
//类的适配器模式(采用组合实现)
class DZManufactureFuture implements ManufactureFuture{
    protected DZManufacture manufacturer;
    public DZManufactureFuture(DZManufacture manufacturer){
        this.manufacturer=manufacturer;
    }
	@Override
	public void setBattery() {
		System.out.println("获取广州电池");
		System.out.println("安装广州电池");
		Car car=manufacturer.getCar();
		car.description=car.description+"电池:中国造 ";
	}
	@Override
	public void setWheel() {
	    manufacturer.setWheel();
	}
	@Override
	public Car getCar() {
	    return manufacturer.getCar();
	}
}</span>
<span style="font-size:14px;">//客户端代码
class test  {
	public static void main (String[] args) throws java.lang.Exception{
	    //旧的生产过程
	    DZManufacture manufacture=new DZManufacture();
	    manufacture.setEngine();
	    manufacture.setWheel();
	    Car dz=manufacture.getCar();
	    System.out.println(dz.description);
	    //新的生产过程
	    DZManufacture oldManu=new DZManufacture();
	    ManufactureFuture futureManu=new DZManufactureFuture(oldManu);
	    futureManu.setBattery();
	    futureManu.setWheel();
	    Car car=futureManu.getCar();
	    System.out.println(car.description);
	}
}</span>

适配器模式的适用场景

1、系统需要适用适用现有的类,而此类的接口不符合系统的要求。

适配器其模式在Java中的应用

JDBC驱动软件与适配器模式

Java语言的数据库连接工具JDBC。JDBC使得Java语言程序能够连接到数据库上,并适用SQL来查询和修改数据和数据定义。
JDBC给出了一个客户端通用的界面。每个数据库引擎的JDBC驱动软件都是一个介于JDBC接口和数据库引擎之间的适配器软件。
适配器模式(Adapter)-结构型_第1张图片
抽象的JDBC接口和各个数据库引擎的API之间都需要相应的适配器软件,即为各个数据库引擎准备的驱动软件。

适配器模式与桥梁模式的关系

当一个客户端只知道一个特定的接口,但是又必须与具有不同接口的类打交道时,就应该使用适配器模式。桥梁模式的用意是要把实现和它的接口分开,以便它们可以独立地变化。桥接模式并不是用来把一个已有的对象接到不匹配的接口上。

适配器模式与装饰模式的关系

与适配器不同的是,装饰模式不能改变它所装饰的Component对象的接口。

你可能感兴趣的:(Adapter,适配器模式)