题目:已知新能源汽车的发动机有电能发动机(ElectricMotor)和光能发动机(OpticalMotor),客户端希望通过统一的Motor 接口随便使用任意一种新能源发动机去驱动汽车,请用对象适配器模式将两种不同的新能源发动机适配到同一目标接口中,绘制其类图以及编码实现。
类图:
代码:
Motor .java
package adapter;
/**
* 目标发动机
* @author 9986
*
*/
public interface Motor {
public void drive();
}
ElectricMotor.java
package adapter;
/**
* 适配者1:电能发动机
* @author 9986
*
*/
public class ElectricMotor {
public void electricDrive() {
System.out.println("电能发动机驱动汽车!");
}
}
OpticalMotor .java
package adapter;
/**
* 适配者2:光能发动机
* @author 9986
*
*/
public class OpticalMotor {
public void opticalDrive() {
System.out.println("光能发动机驱动汽车!");
}
}
ElectricAdapter .java
package adapter;
/**
* 电能适配器
* @author 9986
*
*/
public class ElectricAdapter implements Motor{
private ElectricMotor emotor;
public ElectricAdapter() {
emotor = new ElectricMotor();
}
@Override
public void drive() {
emotor.electricDrive();
}
}
OpticalAdapter .java
package adapter;
/**
* 光能适配器
* @author 9986
*
*/
public class OpticalAdapter implements Motor{
private OpticalMotor omotor;
public OpticalAdapter() {
omotor = new OpticalMotor();
}
@Override
public void drive() {
omotor.opticalDrive();
}
}
ReadXML.java
package adapter;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import java.io.*;
public class ReadXML{
public static Object getObject(){
try{
DocumentBuilderFactory dFactory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=dFactory.newDocumentBuilder();
Document doc;
doc = builder.parse(new File("config2.xml"));
NodeList nl=doc.getElementsByTagName("className");
Node classNode=nl.item(0).getFirstChild();
String cName=classNode.getNodeValue();
Class<?> c=Class.forName(cName);
Object obj=c.newInstance();
return obj;
}catch(Exception e){
e.printStackTrace();
return null;
}
}
}
MotorAdapterTest .java
package adapter;
/**
* 客户端代码
* @author 9986
*
*/
public class MotorAdapterTest {
public static void main(String[] args) {
System.out.println("适配器模式测试:");
Motor motor = (Motor) ReadXML.getObject();
motor.drive();
}
}
config2.xml
<?xml version="1.0" encoding="UTF-8"?>
<config>
<className>adapter.ElectricAdapter</className>
<className>adapter.OpticalAdapter</className>
</config>
运行截图: