java 23种设计模式之结构型模式—适配器模式(6)

适配器模式,顾名思义,就是去适配另一种模式

适配器模式:将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间


举几个例子:

1,我们的电话插座,只有一个三孔的,我们要转变成2孔,就可以去买一个转换器可以

2,我们的电脑键盘或鼠标,有ps2圆孔的接口,也有usb接口,我们也可以用一个转换器来实现,比如我的电脑圆孔的ps2接口坏掉了,我就必须用一个转换器将ps2接口转换成usb接口继续使用


我们现在以鼠标的ps2接口为例

现在我们有一个ps2接口的鼠标,但是我们电脑上的ps2接口坏掉了,需要使用usb接口,我们就去买了一个转换器,ps2tousbport(转换器)

先定义电脑的usb接口和鼠标的ps2接口

//电脑的usb接口
public interface usbport {
	public void workusb();
}
//鼠标的ps2接口
public interface ps2port {
	public void workps2();
}
接下来,因为鼠标是好的,因此鼠标的ps2接口i是可以用的,需要被实现

public class ps2portImpl implements ps2port{

	@Override
	public void workps2() {
		System.out.println("ps2接口正在工作中");	
	}

}
转换器接口实现了电脑的usb接口,只有实现了电脑的usb接口,转换器才有用,不然这个转换器就不能用拉

public class ps2tousbport implements usbport{

	@SuppressWarnings("unused")
	private ps2port ps2;
	
	//这里相当于将ps2接口插入到适配器
	public ps2tousbport(ps2port ps2){
		this.ps2 = ps2;
	}
	@Override
	public void workusb() {
		System.out.println("开始转换了");
		//这里相当于开始转换成usb,他只是转换,而工作还是ps2在工作,因为我们的鼠标还是ps2的
		ps2.workps2();
		System.out.println("转换成功!现在只能说,相当于usb在工作了");
		
	}


}
这样,我们通过转换器就使用到了我们买的鼠标了(即是ps2接口)


下面我们看看测试类,测试类也非常简单:

/*
 * 我现在有一个ps2接口的鼠标
 * 但是我电脑的ps2接口坏掉了
 * 我现在想买一个usb转换器
 * 然后可以使用这个ps2接口的鼠标
 */
public class democlient {

	public static void main(String[] args) {
		//我需要一个usb接口
		usbport usb = new ps2tousbport(new ps2portImpl());
		usb.workusb();
		
		System.out.println("电脑上的ps2接口好了,那么我们就不在使用转换器了");
		//如果我们电脑上的ps2接口好了,那么我们就不在使用转换器了
		ps2port ps2 = new ps2portImpl();
		ps2.workps2();
		
	}

}
上面所提到的就是对象适配器,现在我们看看类适配器,类适配器只需要修改一个转换器即可

public class ps2tousbport1 implements usbport,ps2port{

	@Override
	public void workps2() {
		System.out.println("ps2接口正在工作中");	
		
	}

	@Override
	public void workusb() {
		System.out.println("开始转换");
		workps2();
		System.out.println("转换成功,已经在运行");
		
	}

}
测试类中如果电脑的ps2接口能用就直接调用转换器的workps2()方法(即是没有转换),如果电脑的ps2接口不能用,就调用转换器的workusb接口进行转换。

他们的区别在于:

对象适配器实现了客户端想要的接口(USB),在内部有一个被适配对象(PS2)的引用,通过组合实现适配功能。

类适配器实现了客户端想要的接口(USB)和被适配对象接口(PS2),通过继承来实现适配功能。


爆款云服务器s6 2核4G 低至0.46/天,具体规则查看活动详情Blog Img