适配器模式
C++
#include <iostream>
using namespace std;
class Player
{
protected:string name;public:Player(string name) : name(name) {}virtual void Attack() = 0;virtual void Defense() = 0;virtual ~Player() {}
};
class Forwards : public Player
{
public:Forwards(string name) : Player(name) {}virtual void Attack(){cout << "前锋 " << name << "进攻" << endl;}virtual void Defense(){cout << "前锋 " << name << "防守" << endl;}
};
class Center : public Player
{
public:Center(string name) : Player(name) {}virtual void Attack(){cout << "中锋 " << name << "进攻" << endl;}virtual void Defense(){cout << "中锋 " << name << "防守" << endl;}
};
class Guards : public Player
{
public:Guards(string name) : Player(name) {}virtual void Attack(){cout << "后卫 " << name << "进攻" << endl;}virtual void Defense(){cout << "后卫 " << name << "防守" << endl;}
};class ForeignCenter
{
public:void SetName(string name){this->name = name;}string GstName(){return name;}void ForeignAttack(){cout << "外籍中锋 " << name << " 进攻" << endl;}void ForeignDefense(){cout << "外籍中锋 " << name << " 防守" << endl;}private:string name;
};
class Translator : public Player
{
public:Translator(string name) : Player(name){ym = new ForeignCenter;ym->SetName(name);}~Translator(){if (ym != NULL)delete ym;}void Attack(){ ym->ForeignAttack();}void Defense(){ym->ForeignDefense(); }private:ForeignCenter *ym;
};
int main()
{Player *b = new Forwards("巴蒂尔");b->Attack();Player *c = new Guards("麦克格雷迪");c->Attack();Player *ym = new Translator("姚明"); ym->Attack();ym->Defense();return 0;
}
C
#include <stdio.h>
#include <stdlib.h>
#include <string.h>typedef struct Player
{char name[50];void (*attack)(const char *);void (*defense)(const char *);
} Player;typedef struct Forwards
{Player base;
} Forwards;typedef struct Center
{Player base;
} Center;typedef struct Guards
{Player base;
} Guards;typedef struct ForeignCenter
{char name[50];
} ForeignCenter;typedef struct Translator
{Player base;ForeignCenter *foreignCenter;
} Translator;void forwards_attack(const char *name)
{printf("前锋 %s 进攻\n", name);
}void forwards_defense(const char *name)
{printf("前锋 %s 防守\n", name);
}void center_attack(const char *name)
{printf("中锋 %s 进攻\n", name);
}void center_defense(const char *name)
{printf("中锋 %s 防守\n", name);
}void guards_attack(const char *name)
{printf("后卫 %s 进攻\n", name);
}void guards_defense(const char *name)
{printf("后卫 %s 防守\n", name);
}void foreign_center_attack(ForeignCenter *fc)
{printf("外籍中锋 %s 进攻\n", fc->name);
}void foreign_center_defense(ForeignCenter *fc)
{printf("外籍中锋 %s 防守\n", fc->name);
}Player *create_forwards(const char *name)
{Player *p = (Player *)malloc(sizeof(Player));strcpy(p->name, name);p->attack = forwards_attack;p->defense = forwards_defense;return p;
}Player *create_center(const char *name)
{Player *p = (Player *)malloc(sizeof(Player));strcpy(p->name, name);p->attack = center_attack;p->defense = center_defense;return p;
}Player *create_guards(const char *name)
{Player *p = (Player *)malloc(sizeof(Player));strcpy(p->name, name);p->attack = guards_attack;p->defense = guards_defense;return p;
}Translator *create_translator(const char *name)
{Translator *t = (Translator *)malloc(sizeof(Translator));strcpy(t->base.name, name);t->foreignCenter = (ForeignCenter *)malloc(sizeof(ForeignCenter));strcpy(t->foreignCenter->name, name);t->base.attack = (void (*)(const char *))foreign_center_attack;t->base.defense = (void (*)(const char *))foreign_center_defense;return t;
}void player_free(Player *p)
{free(p);
}void translator_free(Translator *t)
{if (t->foreignCenter)free(t->foreignCenter);free(t);
}int main()
{Player *b = create_forwards("巴蒂尔");b->attack(b->name);Player *c = create_guards("麦克格雷迪");c->attack(c->name);Translator *ym = create_translator("姚明");ym->base.attack(ym->base.name);ym->base.defense(ym->base.name);player_free(b);player_free(c);translator_free(ym);return 0;
}