设计模式学习--适配器模式

原创 2015年07月08日 00:33:31

创建型模式学习完了,接下来学习的是结构性模式。结构型模式主要涉及到如何组合类和对象以获得更大的结构,通常采用继承机制来组合接口和实现。
首先学习的是适配器模式。首先是适配器的定义:
适配器模式,将一个类的接口转换成客户所希望的另外一个接口。适配器模式使得原来由于接口不兼容而不能一起工作的类可以一起工作。
简单的说当系统的数据和行为都正确时,但接口不符时,我们应该考虑使用适配器模式。目的是是控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用于希望用一些现存的类,但是接口又与复用环境要求不一致的情况。俗话说的好,智者千虑,必有一失。类的编写者可能考虑不到后期软件需求的变化。此时,适配器模式就派上用场了。根据GOF的设计模式,分为两种类的设计模式对象适配器模式
类适配器模式的结构图:
类适配器模式
对象适配器模式结构图:
对象适配器模式
适用性
1 你想使用一个已经存在的类,而他的接口不符合你的要求
2 你想创建一个可以复用的类,该类可以与其他不相关的或不可预见的类协同工作
3 你想使用一个已经存在的子类,但是不可能对每一个都进行子类化以匹配他们的接口。对象适配器可以适配它的父类接口。(仅适用于对象适配器)
协作
Client在Adapter实例上调用一些操作。接着适配器调用Adaptee的操作实现这个请求。
类适配与对象适配的区别
类适配:
1 用一个具体的Adapter类对Adapter和Target进行匹配。结果是当我们想要匹配一个类以及所有子类时,类Adapter将不能胜任工作。
2 使得Adapter可以重定义Adaptee的部分行为,因为Adapter是Adaptee的一个子类
3 仅仅引入一个对象,并不需要额外的指针以间接得到adaptee
4 使用多重继承对一个接口与另一个接口进行匹配
对象适配:
1 允许一个Adapter与多个adaptee
2 使得重定义adaptee的行为比较困难
3 依赖于对象组合
需要考虑的其他因素
1 Adapter的匹配程度
2 可插入的adapter
3 使用双向适配器提供透明操作
例子,为了通用性因为很多语言并不支持多重继承,这里暂时先给出对象适配器的例子

// Adapter.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "Translate.h"
#include "BikePlayer.h"
int _tmain(int argc, _TCHAR* argv[])
{
    BikePlayer* bikePlayer = new BikePlayer;
    Translate* translate = new Translate(bikePlayer);
    translate->say();
    return 0;
}

#pragma once
class Player
{
public:
    Player();
    ~Player();
    virtual void say() = 0;
private:
};

#pragma once
#include "Player.h"
class BasketBallPlayer : public Player
{
public:
    BasketBallPlayer();
    ~BasketBallPlayer();
    virtual void say();
private:

};

#include "BasketBallPlayer.h"
#include <iostream>
using namespace std;

BasketBallPlayer::BasketBallPlayer()
{
}

BasketBallPlayer::~BasketBallPlayer()
{
}

void BasketBallPlayer::say()
{
    cout << "篮球运动员" << endl;
}

#pragma once
#include "Player.h"

class FootBallPlayer : public Player
{
public:
    FootBallPlayer();
    ~FootBallPlayer();
    virtual void say();
private:

};

#include "FootBallPlayer.h"
#include <iostream>
using namespace std;

FootBallPlayer::FootBallPlayer()
{
}

FootBallPlayer::~FootBallPlayer()
{
}

void FootBallPlayer::say()
{
    cout << "足球运动员" << endl;
}

#pragma once
#include "Player.h"
#include "BikePlayer.h"
class Translate : public Player 
{
public:
    Translate(BikePlayer* bikePlayer);
    ~Translate();
    virtual void say();
private:
    BikePlayer* m_bikePlayer;
};

#include "Translate.h"
Translate::Translate(BikePlayer* bikePlayer)
    :m_bikePlayer(bikePlayer)
{
}

Translate::~Translate()
{
}

void Translate::say()
{
    m_bikePlayer->bsay();
}
#pragma once

class BikePlayer
{
public:
    BikePlayer();
    ~BikePlayer();
    void bsay();
private:

};

#include "BikePlayer.h"
#include <iostream>
using namespace std;

BikePlayer::BikePlayer()
{
}

BikePlayer::~BikePlayer()
{
}

void BikePlayer::bsay()
{
    cout << "自行车运动员" << endl;
}

设计模式(二) 三种适配器模式 总结和使用场景

转载请标明出处: http://blog.csdn.net/zxt0601/article/details/52703280本文出自:【张旭童的博客】一 概述定义:适配器模式将某个类的接口转换成客...
  • zxt0601
  • zxt0601
  • 2016年10月18日 16:34
  • 3075

一个示例让你明白适配器模式

本文讨论适配器模式。适配器模式是23中设计模式之一,它的主要作用是在新接口和老接口之间进行适配。它非常像我们出国旅行时带的电源转换器。为了举这个例子,我还特意去京东上搜了一下电源转换器,确实看到了很多...
  • brave2211
  • brave2211
  • 2014年01月26日 00:08
  • 42612

设计模式-缺省适配器模式

介绍大家所熟悉的是如果实现某一个接口,必须实现接口中的每一个方法。在适配器模式中,如果目标(Target)角色中的方法众多,需要的仅仅几个。但是根据接口的实现规则,其余的方法也必须实现,这必然造成了很...
  • IO_Field
  • IO_Field
  • 2016年10月11日 21:31
  • 1098

设计模式(工厂模式、适配器模式)

设计模式是面向对象程序编程的重要学习内容。设计模式的应用对于面向对象编程来说相当于经验,能够复用代码同时安全可靠。本文介绍工厂模式、策略模式和适配器模式。        工厂模式包括简单工厂模式,工厂...
  • yutianxin123
  • yutianxin123
  • 2016年09月06日 10:05
  • 792

适配器模式与Java应用

适配器模式与Java应用​ 在设计模式中或者说在很多编程场景下经常会使用到适配器,有心或无意。顾名思义,适配器就是将一个类的接口适配(包装/转换)成客户(调用者)希望的另一个接口。适配模式又可以细...
  • jackshiny
  • jackshiny
  • 2016年10月06日 13:07
  • 2349

23种设计模式(13):适配器模式

本文主要介绍设计模式中的适配器模式。
  • psp0001060
  • psp0001060
  • 2016年02月25日 16:21
  • 596

菜鸟版JAVA设计模式—适配器模式,装饰模式,代理模式异同

节前把3个设计模式的学习心得分享了一下,分别是适配器模式,装饰模式,代理模式。 但是似乎越写越有些迷糊,这三种模式都有着一些大同小异的地方,总是有些搞不清。 今天再重新学习下,把学习心得分享给大家一下...
  • lulei9876
  • lulei9876
  • 2014年10月14日 10:55
  • 12071

设计模式——适配器模式 Java源代码

适配器模式,《Head First Design Patterns》给的代码的例子是关于鸭子和火鸡,然而鸭子和火鸡离日常生活比较远。这次,我改编了实验楼网站上面的例子,关于插座和充电器。...
  • u013390476
  • u013390476
  • 2016年01月01日 16:02
  • 2373

解析SpringMVC源码中使用到的“适配器”模式

前言      关于SpringMVC初始化ContextLoader中的XMLWebApplicationContext,以及DispatcherServlet初始化等等,这样的原理 已经有N多的前...
  • w1033162186
  • w1033162186
  • 2016年02月04日 15:51
  • 987

Java设计模式菜鸟系列(八)适配器模式建模与实现

适配器模式(Adapter):将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。 主要分为三类:类的适配器模式、对象的适配器模式、接口的适配器模式。 1...
  • JAVE_LOVER
  • JAVE_LOVER
  • 2014年10月05日 19:52
  • 2360
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式学习--适配器模式
举报原因:
原因补充:

(最多只允许输入30个字)