本文目录导读:

我来为你提供几个Java适配器模式的典型案例,从基础到实际应用。
基础案例:电源适配器
场景
不同国家的电源插座标准不同,需要一个适配器来转换。
// 目标接口(中国标准插座)
interface ChinaSocket {
void connectChinaPlug();
}
// 适配者类(美国标准插座)
class USASocket {
public void connectUSAPlug() {
System.out.println("连接美国标准插头");
}
}
// 对象适配器
class SocketAdapter implements ChinaSocket {
private USASocket usaSocket;
public SocketAdapter(USASocket usaSocket) {
this.usaSocket = usaSocket;
}
@Override
public void connectChinaPlug() {
System.out.println("使用转换器转换电压和插头");
usaSocket.connectUSAPlug();
}
}
// 使用示例
public class SocketDemo {
public static void main(String[] args) {
ChinaSocket chinaSocket = new SocketAdapter(new USASocket());
chinaSocket.connectChinaPlug();
}
}
实际业务案例:支付系统适配
场景
整合不同的支付服务提供商(支付宝、微信、PayPal)。
// 目标接口
interface PaymentGateway {
void processPayment(double amount);
void refund(double amount);
}
// 支付宝实现
class AlipayGateway {
public void pay(double amount) {
System.out.println("支付宝支付: " + amount + "元");
}
public void refundMoney(double amount) {
System.out.println("支付宝退款: " + amount + "元");
}
}
// 微信支付实现
class WeChatPayGateway {
public void makePayment(double amount) {
System.out.println("微信支付: " + amount + "元");
}
public void processRefund(double amount) {
System.out.println("微信退款: " + amount + "元");
}
}
// 支付宝适配器
class AlipayAdapter implements PaymentGateway {
private AlipayGateway alipayGateway;
public AlipayAdapter(AlipayGateway alipayGateway) {
this.alipayGateway = alipayGateway;
}
@Override
public void processPayment(double amount) {
alipayGateway.pay(amount);
}
@Override
public void refund(double amount) {
alipayGateway.refundMoney(amount);
}
}
// 微信适配器
class WeChatPayAdapter implements PaymentGateway {
private WeChatPayGateway weChatPayGateway;
public WeChatPayAdapter(WeChatPayGateway weChatPayGateway) {
this.weChatPayGateway = weChatPayGateway;
}
@Override
public void processPayment(double amount) {
weChatPayGateway.makePayment(amount);
}
@Override
public void refund(double amount) {
weChatPayGateway.processRefund(amount);
}
}
// 使用示例
public class PaymentDemo {
public static void main(String[] args) {
PaymentGateway alipay = new AlipayAdapter(new AlipayGateway());
PaymentGateway weChatPay = new WeChatPayAdapter(new WeChatPayGateway());
// 统一下单
alipay.processPayment(99.9);
weChatPay.processPayment(199.9);
// 统一退款
alipay.refund(10.0);
weChatPay.refund(20.0);
}
}
类适配器(使用继承)
场景
将一个类接口转换为目标接口。
// 目标接口
interface NewLogger {
void logInfo(String msg);
void logError(String msg);
}
// 旧日志类(已有实现)
class OldLogger {
public void log(String level, String message) {
System.out.println("[" + level + "] " + message);
}
}
// 类适配器(使用继承)
class LoggerAdapter extends OldLogger implements NewLogger {
@Override
public void logInfo(String msg) {
log("INFO", msg);
}
@Override
public void logError(String msg) {
log("ERROR", msg);
}
}
// 使用示例
public class LoggerDemo {
public static void main(String[] args) {
NewLogger logger = new LoggerAdapter();
logger.logInfo("应用启动");
logger.logError("发生异常");
}
}
企业级应用:数据转换适配器
场景
将不同格式的数据转换为统一格式。
import java.util.HashMap;
import java.util.Map;
// 目标接口
interface DataConverter {
Map<String, Object> convert(Object data);
}
// 适配者1:JSON数据转换
class JsonDataHandler {
public Map<String, Object> parseJson(String jsonData) {
// 模拟解析JSON
Map<String, Object> result = new HashMap<>();
result.put("source", "JSON");
result.put("content", jsonData);
return result;
}
}
// 适配者2:XML数据转换
class XmlDataHandler {
public Map<String, Object> parseXml(String xmlData) {
// 模拟解析XML
Map<String, Object> result = new HashMap<>();
result.put("source", "XML");
result.put("content", xmlData);
return result;
}
}
// JSON适配器
class JsonAdapter implements DataConverter {
private JsonDataHandler jsonHandler;
public JsonAdapter(JsonDataHandler jsonHandler) {
this.jsonHandler = jsonHandler;
}
@Override
public Map<String, Object> convert(Object data) {
return jsonHandler.parseJson((String) data);
}
}
// XML适配器
class XmlAdapter implements DataConverter {
private XmlDataHandler xmlHandler;
public XmlAdapter(XmlDataHandler xmlHandler) {
this.xmlHandler = xmlHandler;
}
@Override
public Map<String, Object> convert(Object data) {
return xmlHandler.parseXml((String) data);
}
}
// 使用示例
public class DataConverterDemo {
public static void main(String[] args) {
String jsonData = "{\"name\": \"张三\", \"age\": 25}";
String xmlData = "<person><name>李四</name><age>30</age></person>";
DataConverter jsonConverter = new JsonAdapter(new JsonDataHandler());
DataConverter xmlConverter = new XmlAdapter(new XmlDataHandler());
Map<String, Object> jsonResult = jsonConverter.convert(jsonData);
Map<String, Object> xmlResult = xmlConverter.convert(xmlData);
System.out.println("JSON转换结果: " + jsonResult);
System.out.println("XML转换结果: " + xmlResult);
}
}
JDK中的适配器示例
import java.util.Arrays;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Vector;
// JDK中的适配器示例
public class JdkAdapterDemo {
public static void main(String[] args) {
// 将Enumeration适配为Iterator(适配器模式)
Vector<String> vector = new Vector<>(Arrays.asList("A", "B", "C"));
Enumeration<String> enumeration = vector.elements();
// 使用适配器将Enumeration转换为Iterator
Iterator<String> iterator = new Iterator<String>() {
private Enumeration<String> enum = enumeration;
@Override
public boolean hasNext() {
return enum.hasMoreElements();
}
@Override
public String next() {
return enum.nextElement();
}
};
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
完整的多适配器管理器
import java.util.HashMap;
import java.util.Map;
// 多种适配器统一管理
interface UnifiedAPI {
void initialize();
void execute(String command);
void cleanup();
}
// 应用A的API
class AppA {
public void startA() { System.out.println("AppA启动"); }
public void runA(String cmd) { System.out.println("AppA执行: " + cmd); }
public void stopA() { System.out.println("AppA停止"); }
}
// 应用B的API
class AppB {
public void initB() { System.out.println("AppB初始化"); }
public void processB(String cmd) { System.out.println("AppB处理: " + cmd); }
public void shutdownB() { System.out.println("AppB关闭"); }
}
// 适配器A
class AdapterA implements UnifiedAPI {
private AppA appA;
public AdapterA(AppA appA) {
this.appA = appA;
}
@Override
public void initialize() { appA.startA(); }
@Override
public void execute(String command) { appA.runA(command); }
@Override
public void cleanup() { appA.stopA(); }
}
// 适配器B
class AdapterB implements UnifiedAPI {
private AppB appB;
public AdapterB(AppB appB) {
this.appB = appB;
}
@Override
public void initialize() { appB.initB(); }
@Override
public void execute(String command) { appB.processB(command); }
@Override
public void cleanup() { appB.shutdownB(); }
}
// 适配器管理器
class AdapterManager {
private Map<String, UnifiedAPI> adapters = new HashMap<>();
public void registerAdapter(String name, UnifiedAPI adapter) {
adapters.put(name, adapter);
}
public void execute(String name, String command) {
UnifiedAPI adapter = adapters.get(name);
if (adapter != null) {
adapter.initialize();
adapter.execute(command);
adapter.cleanup();
} else {
System.out.println("找不到适配器: " + name);
}
}
}
// 使用示例
public class AdapterManagerDemo {
public static void main(String[] args) {
AdapterManager manager = new AdapterManager();
// 注册适配器
manager.registerAdapter("AppA", new AdapterA(new AppA()));
manager.registerAdapter("AppB", new AdapterB(new AppB()));
// 统一执行
manager.execute("AppA", "数据分析");
System.out.println("---");
manager.execute("AppB", "报表生成");
}
}
适配器模式要点总结
优点
- 解耦:使客户端与适配者解耦,不直接依赖具体实现
- 复用:可以重复使用现有的类,同时不改变现有代码
- 灵活:增加了类的透明性和复用性
应用场景
- 系统需要使用现有的类,但接口不符合要求
- 想要创建一个可复用的类,该类的接口与多个独立类兼容
- 需要统一多个不同系统的接口
注意事项
- 避免过度使用,不要在系统设计初期就使用大量适配器
- 考虑是否可以通过重构来避免使用适配器
- 对象适配器比类适配器更灵活(使用组合而非继承)
这些案例涵盖了适配器模式的主要应用场景,从简单的接口转换到复杂的系统整合,根据实际需求可以选择对象适配器或类适配器来实现。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播