参考:http://blog.jobbole.com/109381/

将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

系统的数据和行为都正确,但接口不符时,我们应该考虑使用适配器,目的是使控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况。

比如购买的第三方开发组件,该组件接口与我们自己系统的接口不相同,或者由于某种原因无法直接调用该组件,可以考虑适配器。

适配器模式分为类模式和对象模式

案例:中国人去欧洲旅游,由于欧标规定双脚电源的都为O字口,而中国人用1字口的充电器,这时中国人给设备充电则需要适配器Dispatcher。

一.类模式

类模式的实现方式为多继承,通过public继承获得接口继承的效果,通过private继承获得实现继承的效果。

C++代码

 #include <iostream>

 using namespace std;

 class IEuropeSocket{
public:
virtual void charge() = ;
}; class ChineseCharger{
public:
void chargeWithFeetFlat(){
cout << "Charge with Chinese charger"<<endl;
}
}; class PowerAdapter:public IEuropeSocket, private ChineseCharger{
public:
virtual void charge(){
cout << "use Chinese charger and a Europe adapter"<< endl;
this->chargeWithFeetFlat();
}
}; int main()
{
PowerAdapter *adapter = new PowerAdapter();
adapter->charge();
return ;
}

Java代码

 public interface IEuropeSocket {
void charge();
} public class ChineseCharger {
void chargeWithFeetFlat(){
System.out.println("Charge with Chinese charger");
}
} public class PowerAdapter extends ChineseCharger implements IEuropeSocket{ public void charge(){
System.out.println("use Chinese charger and a Europe adapter");
chargeWithFeetFlat();
}
} public class Main {
public static void main(String[] args){
PowerAdapter adapter = new PowerAdapter();
adapter.charge();
}
}

二.对象模式

对象模式的实现方式为将适配者作为适配器类的成员。

C++代码

 #include <iostream>

 using namespace std;

 class IEuropeSocket{
public:
virtual void charge() = ;
}; class ChineseCharger{
public:
void chargeWithFeetFlat(){
cout << "Charge with Chinese charger"<<endl;
}
}; class PowerAdapter:public IEuropeSocket{
private:
ChineseCharger *m_charger;
public:
PowerAdapter(ChineseCharger* p){m_charger = p;} virtual void charge(){
cout << "use Chinese charger and a Europe adapter"<< endl;
m_charger->chargeWithFeetFlat();
}
}; int main()
{
PowerAdapter *adapter = new PowerAdapter(new ChineseCharger());
adapter->charge();
return ;
}

Java代码

 public interface IEuropeSocket {
void charge();
} public class ChineseCharger {
void chargeWithFeetFlat(){
System.out.println("Charge with Chinese charger");
}
} public class PowerAdapter implements IEuropeSocket{ private ChineseCharger charger; PowerAdapter(ChineseCharger charger) {
System.out.println("use Chinese charger and a Europe adapter");
this.charger = charger;
} public void charge() {
charger.chargeWithFeetFlat();
}
} public class Main {
public static void main(String[] args){
PowerAdapter adapter = new PowerAdapter(new ChineseCharger());
adapter.charge();
}
}

两种语言实现设计模式(C++和Java)(四:适配器模式)的更多相关文章

  1. 两种语言实现设计模式(C++和Java)(一:工厂模式)

    本篇开始记录实现设计模式在工作中的两种常见语言上的实现. 本篇介绍最简单的工厂模式. 工厂模式有一种非常形象的描述,建立对象的类就如一个工厂,而需要被建立的对象就是一个个产品:在工厂中加工产品,使用产 ...

  2. 两种语言实现设计模式(C++和Java)(三:策略模式)

    策略模式是指定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化.也就是说这些算法所完成的功能一样,对外的接口一样,只是各自实现上存在差异.用策略模式 ...

  3. 两种语言实现设计模式(C++和Java)(二:单例模式)

    本篇介绍单例模式,可以说是使用场景最频繁的设计模式了.可以根据实例的生成时间,分为饿汉模式和懒汉模式 懒汉模式:饿了肯定要饥不择食.所以在单例类定义的时候就进行实例化. 饿汉模式:故名思义,不到万不得 ...

  4. 栈的图文解析 和 对应3种语言的实现(C/C++/Java)

    概要 本章会先对栈的原理进行介绍,然后分别通过C/C++/Java三种语言来演示栈的实现示例.注意:本文所说的栈是数据结构中的栈,而不是内存模型中栈.内容包括:1. 栈的介绍2. 栈的C实现3. 栈的 ...

  5. 队列的图文解析 和 对应3种语言的实现(C/C++/Java)

    概要 本章和介绍"栈"时的流程一样,先对队列进行介绍,然后分别给出队列的C.C++和Java三种语言的实现.内容包括:1. 队列的介绍2. 队列的C实现3. 队列的C++实现4.  ...

  6. I/O模型系列之四:两种高性能IO设计模式 Reactor 和 Proactor

    不同的操作系统实现的io策略可能不一样,即使是同一个操作系统也可能存在多重io策略,常见如linux上的select,poll,epoll,面对这么多不同类型的io接口,这里需要一层抽象api来完成, ...

  7. 栈的图文解析 和 对应3种语言的实现(C/C++/Java)【转】

    概要 本章会先对栈的原理进行介绍,然后分别通过C/C++/Java三种语言来演示栈的实现示例.注意:本文所说的栈是数据结构中的栈,而不是内存模型中栈.内容包括:1. 栈的介绍2. 栈的C实现3. 栈的 ...

  8. 使用OC和Swift两种语言写一个发射烟花的小项目

    OC与Swift两种实现方式基本上区别不大,主要是在一些对象或方法的调用方式不同,附带源码. OC代码样式: self.view.backgroundColor = [UIColor blackCol ...

  9. 设计模式总结(Java)—— 适配器模式

    适配器模式中引入了一个被称为适配器(Adapter)的包装类,而它所包装的对象称为适配者(Adaptee),即被适配的类.适配器的实现就是把客户类的请求转化为对适配者的相应接口的调用.也就是说:当客户 ...

随机推荐

  1. Linux中python3,django,redis以及mariab的安装

    1. Linux中python3,django,redis以及mariab的安装 2. CentOS下编译安装python3 编译安装python3.6的步骤 1.下载python3源码包 wget ...

  2. XV Open Cup named after E.V. Pankratiev. GP of Central Europe (AMPPZ-2014)--J.Cave

    给你一棵树,现在有m个专家,每个专家计划从$a_i$走到$b_i$, 经过的距离不超过$d_i$,现在让你找一个点,使得所有专家的路途都能经过这个点 令$S_i$表示满足第i个专家的所有点,先检查1可 ...

  3. React文档(二十一)协调

    React提供了一个声明式地API因此你不用担心每一次更新什么东西改变了.这使得开发应用变得简单,但是这个东西在React中如何实现的并不是很明显.这篇文章会解释我们在React的算法中所做的选择以便 ...

  4. 关于git的诞生

    看了某某大佬的Git教程,简单易懂的同时,也让我对Git有了进一步的了解.搞半天,我们顶礼膜拜的分布式版本控制系统Git,是在这样的情况下产生的. linus在创建开源的linux系统的时候,并不是他 ...

  5. SQL Server 2005 企业版没有 Microsoft SQL Server Management

    我从网上下载的:SQL Server 2005 集成sp2的 企业版安装后没发现 Management Studio管理工具,起初以为是自己安装时没装上,昨天试了全部安装后还是没找到,很是郁闷,在网上 ...

  6. react .net core 发布 Access-Control-Allow-Origin Cors

    本案例用IIS部署 1. 在react上先publish: npm run build 生成了build文件,在此文件里添加web.config,注意httpProtocol是用来跨域的. <? ...

  7. springBoot 随笔(二)

    此文为springBoot 结合 thymeleaf ,解析后台接口数据展示到html页面 基于 springBoot(一)工程. 1/ 引用 thymeleaf 组件依赖 <!-- depen ...

  8. 微信为什么不能下载apk 微信不能打开App下载地址的问题

    此方法可以实现微信内置浏览器跳转到手机其它浏览器,现在网上其它的方法都只是一个页面,让访问者自己手动点右上角浏览器打开,而这个不同,是可以直接自动跳转的.       <?php   error ...

  9. error connecting to master 'repl@192.168.1.107:3306' - retry-time: 60 retries: 86400

    很多时候,就算thread 正在进行,也不代表没有错误,一定要看看具体表示错误的变量 mysql> show slave status\G *************************** ...

  10. python小总结3(异常、单例设计模式)

    一.异常 AttributeError:试图访问一个对象没有的成员[属性和方法] ValueError:值错误,传入了一个不期望的值 ImportError:无法导入模块或者包:基本上路径问题 Ind ...