使用适配器模式模拟篮球队翻译 C++

81 篇文章 0 订阅
29 篇文章 1 订阅

说下对适配器模式的理解:
适配器模式: 将一个类的接口转换成客户希望的另外一个接口, 他使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
ie, 系统的数据和行为都是正确的, 但是接口不服符合时, 我们就应该考虑使用适配器, 目的是使得控制范围之外的一个原有对象与某个接口匹配。 适配器模式主要应用于希望复用一些现存的类, 但是接口又与复用环境不一致的情况。
一般在后期维护, 或者调用第三方API的时候, 可以考虑使用, 前期或者重构的时候, 不建议使用这个模式。

UML:
这里写图片描述
运行效果:
这里写图片描述
code:
player.h

#ifndef _PLAYER_H_
#define _PLAYER_H_

#include <string>

/************************************************************************/
/* 球员类                                                               */
/************************************************************************/
class CIPlayer{
public:
    virtual void Attack() = 0;
    virtual void Defense() = 0;

    CIPlayer(std::string name){ this->name = name; }
protected:
    std::string name;   
};

#endif // _PLAYER_H_

mainplayer.h

#ifndef _MAINPLAYER_H_
#define _MAINPLAYER_H_

#include "player.h"

#include <iostream>
using std::cout;
using std::endl;

/************************************************************************/
/* 前锋                                                                 */
/************************************************************************/
class Forwards : public CIPlayer{
public:
    Forwards(std::string name) : CIPlayer(name){}

    void Attack() override{ cout << "前锋 " << name << " 进攻" << endl; }
    void Defense() override{ cout << "前锋" << name << " 防守" << endl; }
};

/************************************************************************/
/* 中锋                                                                 */
/************************************************************************/
class Center : public CIPlayer{
public:
    Center(std::string name) : CIPlayer(name){}

    void Attack() override{ cout << "中锋 " << name << " 进攻" << endl; }
    void Defense() override{ cout << "中锋" << name << " 防守" << endl; }
};

/************************************************************************/
/* 后卫                                                                 */
/************************************************************************/
class Guards : public CIPlayer{
public:
    Guards(std::string name) : CIPlayer(name){}

    void Attack() override{ cout << "后卫  " << name << " 进攻" << endl; }
    void Defense() override{ cout << "后卫 " << name << " 防守" << endl; }
};

#endif // _MAINPLAYER_H_

adapter.h

#include "Adaptee.h"
#include "player.h"
#include <memory>
#include <string>

/************************************************************************/
/* 适配对象                                                             */
/************************************************************************/
class Adapter : public CIPlayer{
public:
    void Attack() override{ center->进攻(); }
    void Defense() override{ center->防守(); }

    Adapter(std::string name) : CIPlayer(name), center(new ForeignCenter(name)){}

private:
    std::shared_ptr<ForeignCenter> center;
};

#endif // _ADAPTER_H_

adaptee.h

#ifndef _ADAPTEE_H_
#define _ADAPTEE_H_

#include <string>
#include <iostream>
using std::cout;
using std::endl;

/************************************************************************/
/* 外籍中锋                                                             */
/************************************************************************/
class ForeignCenter{
public:
    ForeignCenter(std::string name){ this->name = name; }

    void 进攻() { cout << "中锋 " << name << " 进攻" << endl; }
    void 防守() { cout << "中锋" << name << " 防守" << endl; }

private:
    std::string name;   
};


#endif //_ADAPTEE_H_

main.cpp

#include "MainPlayers.h"
#include "Adapter.h"

#include <iostream>
#include <memory>

using namespace std;

int main(){
    shared_ptr<CIPlayer> asan(new Forwards("asan"));
    asan->Attack();

    shared_ptr<CIPlayer> lisi(new Guards("lisi"));
    lisi->Attack();

    shared_ptr<CIPlayer> yaom(new Adapter("yaom"));
    yaom->Attack();
    yaom->Defense();

    system("pause");
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值