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

意图

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

角色

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


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

类的适配器模式

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

类图


实例

//适配源  
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+"电池:中国造 ";
	}
}
//客户端代码
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);
	}
}

对象的适配器模式

类图


实例

//适配源  
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();
	}
}
//客户端代码
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);
	}
}

适配器模式的适用场景

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

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

JDBC驱动软件与适配器模式

Java语言的数据库连接工具JDBC。JDBC使得Java语言程序能够连接到数据库上,并适用SQL来查询和修改数据和数据定义。
JDBC给出了一个客户端通用的界面。每个数据库引擎的JDBC驱动软件都是一个介于JDBC接口和数据库引擎之间的适配器软件。

抽象的JDBC接口和各个数据库引擎的API之间都需要相应的适配器软件,即为各个数据库引擎准备的驱动软件

Java I/O中的适配器模式

适配器的作用就是将一个接口适配到另一个接口。在Java的I/O类库有很多这样的需求。如将字符串数据转换成为字节数据保存在文件中,将字节数据转换成字符流数据等。

InputStreamReader和OutputStreamWriter类分别继承了Reader和Writer抽象类。但是,要创建他们的对象需要在构造器中传入一个InputStream和OutputStream的实例。

InputStreamReader和OutputStreamWriter的作用也就是将InputStream和OutputStream适配到Reader和Writer。

InputStreamReader的类结构图:


InputStreamReader实现了Reader接口,并且持有了InputStream的引用,这里是通过StreamDecoder类间接持有的,因为从byte到char要经过编码。

很显然适配器就是InputStreamReader类,而源角色就是InputStream代表的实例对象。目标接口就是Reader类。

OutputStreamWriter类也是类似的方式。

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

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

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

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


  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值