两种语言实现设计模式(C++和Java)(四:适配器模式)
参考:http://blog.jobbole.com/109381/
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
系统的数据和行为都正确,但接口不符时,我们应该考虑使用适配器,目的是使控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况。
比如购买的第三方开发组件,该组件接口与我们自己系统的接口不相同,或者由于某种原因无法直接调用该组件,可以考虑适配器。
适配器模式分为类模式和对象模式
案例:中国人去欧洲旅游,由于欧标规定双脚电源的都为O字口,而中国人用1字口的充电器,这时中国人给设备充电则需要适配器Dispatcher。
一.类模式
类模式的实现方式为多继承,通过public继承获得接口继承的效果,通过private继承获得实现继承的效果。
C++代码
1 #include <iostream> 2 3 using namespace std; 4 5 class IEuropeSocket{ 6 public: 7 virtual void charge() = 0; 8 }; 9 10 class ChineseCharger{ 11 public: 12 void chargeWithFeetFlat(){ 13 cout << "Charge with Chinese charger"<<endl; 14 } 15 }; 16 17 class PowerAdapter:public IEuropeSocket, private ChineseCharger{ 18 public: 19 virtual void charge(){ 20 cout << "use Chinese charger and a Europe adapter"<< endl; 21 this->chargeWithFeetFlat(); 22 } 23 }; 24 25 int main() 26 { 27 PowerAdapter *adapter = new PowerAdapter(); 28 adapter->charge(); 29 return 0; 30 }
Java代码
1 public interface IEuropeSocket { 2 void charge(); 3 } 4 5 public class ChineseCharger { 6 void chargeWithFeetFlat(){ 7 System.out.println("Charge with Chinese charger"); 8 } 9 } 10 11 public class PowerAdapter extends ChineseCharger implements IEuropeSocket{ 12 13 public void charge(){ 14 System.out.println("use Chinese charger and a Europe adapter"); 15 chargeWithFeetFlat(); 16 } 17 } 18 19 public class Main { 20 public static void main(String[] args){ 21 PowerAdapter adapter = new PowerAdapter(); 22 adapter.charge(); 23 } 24 }
二.对象模式
对象模式的实现方式为将适配者作为适配器类的成员。
C++代码
1 #include <iostream> 2 3 using namespace std; 4 5 class IEuropeSocket{ 6 public: 7 virtual void charge() = 0; 8 }; 9 10 class ChineseCharger{ 11 public: 12 void chargeWithFeetFlat(){ 13 cout << "Charge with Chinese charger"<<endl; 14 } 15 }; 16 17 class PowerAdapter:public IEuropeSocket{ 18 private: 19 ChineseCharger *m_charger; 20 public: 21 PowerAdapter(ChineseCharger* p){m_charger = p;} 22 23 virtual void charge(){ 24 cout << "use Chinese charger and a Europe adapter"<< endl; 25 m_charger->chargeWithFeetFlat(); 26 } 27 }; 28 29 int main() 30 { 31 PowerAdapter *adapter = new PowerAdapter(new ChineseCharger()); 32 adapter->charge(); 33 return 0; 34 }
Java代码
1 public interface IEuropeSocket { 2 void charge(); 3 } 4 5 public class ChineseCharger { 6 void chargeWithFeetFlat(){ 7 System.out.println("Charge with Chinese charger"); 8 } 9 } 10 11 public class PowerAdapter implements IEuropeSocket{ 12 13 private ChineseCharger charger; 14 15 PowerAdapter(ChineseCharger charger) { 16 System.out.println("use Chinese charger and a Europe adapter"); 17 this.charger = charger; 18 } 19 20 public void charge() { 21 charger.chargeWithFeetFlat(); 22 } 23 } 24 25 public class Main { 26 public static void main(String[] args){ 27 PowerAdapter adapter = new PowerAdapter(new ChineseCharger()); 28 adapter.charge(); 29 } 30 }
分类:
设计模式
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具