参考: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. 使用Composer安装Symfony

    最近的一些项目都会使用symfony框架,首先的第一个问题就是symfony框架的下载及安装,symfony要求的php环境5.5以上的,需要php版本的切换.使用的是windows版的安装起来较为麻 ...

  2. 利用python解析地址经纬度和利用经纬度定位地址

    解析地址经纬度 from geopy.geocoders import Nominatim try: geolocator = Nominatim() location = geolocator.ge ...

  3. ZedBoard前期准备工作

    1. 资源下载 内核:https://github.com/Xilinx/linux-xlnx/releases uboot:https://github.com/Xilinx/u-boot-xlnx ...

  4. 解决Charles https抓包显示<unknown>

    用mac电脑开发安卓的都应该知道青花瓷吧~(不知道的都是小菜鸡,邪恶.jpg) Charles类似Windows版的Fiddler(没用过Fiddler的都是小菜鸡中的战斗机,嘲笑.png),基本用法 ...

  5. Mybatis逆向工程自动生成代码(Ubuntu18.04-idea环境)

    最近在学习taotao商城项目,有一节是关于mybatis逆向工程的,参考了这个博文,https://blog.csdn.net/yerenyuan_pku/article/details/71909 ...

  6. cocoapods 换源

    1. 用以下步骤换源: pod repo remove master pod repo add master https://code.aliyun.com/Magi/CocoaPods.git po ...

  7. datatable 添加列之前判断是否存在该列

    if (!dt.Columns.Contains("BDate")) { DataColumn dc1 = new DataColumn("BDate", ty ...

  8. datatable处理gridview筛选后的值

    DataTable dt = (DataTable)gridView1.GridControl.DataSource; DataRow[] drr = dt.Select(gridView1.RowF ...

  9. python之生成器与迭代器

    生成器 列表生成式:li = [i for i in range(10)] 将列表生成式中[]换成()即为生成器generator 生成器保存的对象不是具体的数,而是一种算法,一种推导式,调用__ne ...

  10. SVN分支与合并【超详细的图文教程】(转载)

    SVN分支与合并 一. 分支与合并的概念 二. SVN分支的意义 三. 如何创建分支与合并分支 一.分支与合并的概念: 分支:版本控制系统的一个特性是能够把各种修改分离出来放在开发品的一个分割线上.这 ...