对象适配器模式介绍
- 基本思路和类的适配器模式相同,只是将Adapter类作修改,不是继承src类,而是持有src类的实例,以解决兼容性的问题。即:src类,实现dst类接口,完成src->dst的适配。
- 根据"合成复用原则",在系统尽量使用关联关系来替代继承关系。
- 对象适配器模式是适配器模式常用的一种。
package com.young.adapter.objectadapter;
/**
* 被适配的类
*
* @author Shaw_Young
* @date 2020/10/7 14:12
*/
public class Voltage220V {
/**
* 输出220V电压
*/
public int output220V() {
int src = 220;
System.out.println("电压=" + src + "伏");
return src;
}
}
package com.young.adapter.objectadapter;
/**
* 适配接口
*
* @author Shaw_Young
* @date 2020/10/7 14:14
*/
public interface IVoltage5V {
/**
* 输出5V电压
*
* @return 输出5V电压
*/
int output5V();
}
package com.young.adapter.objectadapter;
/**
* 适配器类
*
* @author Shaw_Young
* @date 2020/10/7 14:15
*/
public class VoltageAdapter implements IVoltage5V {
private Voltage220V voltage220V;
public VoltageAdapter(Voltage220V voltage220V) {
this.voltage220V = voltage220V;
}
@Override
public int output5V() {
int dst = 0;
if (null != voltage220V) {
int src = voltage220V.output220V();
System.out.println("使用对象适配器,进行适配~~");
dst = src / 44;
System.out.println("适配完成,输出的电压为=" + dst);
}
return dst;
}
}
package com.young.adapter.objectadapter;
/**
* @author Shaw_Young
* @date 2020/10/7 14:18
*/
public class Phone {
/**
* 充电
*/
public void charging(IVoltage5V iVoltage5V) {
if (iVoltage5V.output5V() == 5) {
System.out.println("电压为5V,可以充电~~");
} else if (iVoltage5V.output5V() > 5) {
System.out.println("电压大于5V,无法充电~~");
}
}
}
package com.young.adapter.objectadapter;
/**
* @author Shaw_Young
* @date 2020/10/7 14:20
*/
public class Client {
public static void main(String[] args) {
System.out.println("===对象配器模式===");
Phone phone = new Phone();
Voltage220V voltage220V = new Voltage220V();
VoltageAdapter voltageAdapter = new VoltageAdapter(voltage220V);
phone.charging(voltageAdapter);
}
}
对象适配器模式注意事项和细节
- 对象适配器和类适配器其实算是同一种思想,只不过实现方式不同。根据合成复用原则,使用组合替代继承,所以它解决了类适配器必须继承src的局限性问题,也不再要求dst必须是接口。
- 使用成本更低,更灵活。
网友评论